2012-07-12 2 views
1

내 Visual Studio를 사용하여 C++ DLL을 만듭니다. 샘플 C++ 기능은 내가 다음 R 64 비트에서 호출 할 때 위의 코드는 잘 작동C++ from R

dyn.load("Path\myDll.dll") 
.C("MyFunc","Hello") 

다음을 수행하여 R에서이 함수를 호출 할 수 있습니다

void _stdcall MyFunc(char ** strInput) 
{ 
    MessageBox(NULL,"Hi from C++", L"C++ program", NULL); 
} 

입니다. 그러나 DLL을 32 비트 DLL로 컴파일하고 R 32 비트에서 호출하면 메시지 상자가 잠시 표시된 후 충돌이 발생합니다. 나는 내 DLL이 작동하고 다른 프로그램에서 아무 문제없이 그 함수를 호출 할 수 있기 때문에 유효한 32 비트 DLL이라는 것을 알고있다. R 64 비트가 문제없이 동일한 호출을 처리 할 수있을 때 R 32 비트가 충돌하는 이유를 알고 있습니까? 코멘트에서

+2

'_stdcall'을'__cdecl'로 바꾸어보세요. x64는 하나의 보편적 인 호출 규칙을 가지고 있지만 x86은 그렇지 않습니다. – ildjarn

+0

@ildjarn - 그것은 훌륭했고 내 문제를 플래시로 해결했습니다!. 정말 고맙습니다. 자, 해결책을 다시 입력 해 주시면 받아 들일 수 있습니까? –

+0

R이 MinGW로 빌드 될 때 실제로 값을 전송하려고하면 더 심각한 문제가 발생할 것으로 생각됩니다. 모든 기능에 대해 C 언어 래퍼를 통해 얻을 수는 있지만 많은 작업입니다. –

답변

2

재 게시 :

__cdecl – 64와 _stdcall 교체는 하나의 보편적 호출 규칙을 가지고 있지만 86하지 않습니다, 당신은 분명히 잘못된 일을 사용하고 있습니다.

+0

자세한 정보를 추가하려면이 링크는 stdcall의 문제점이 DLL 내보내기 테이블에서 MCVC++ mangles 이름이라는 것을 설명합니다. cdecl은 MinGW (R에서 사용)와 MSVC++ (내 DLL에서 사용) 사이의 상호 운용성의 더 좋은 기회를 보장하지 않습니다. http://stackoverflow.com/questions/6511096/cdecl-or-stdcall-on-windows –

+0

@ curiouspanda : 이름 맹 글링과 호출 규칙은 대부분 별개의 문제입니다. extern "C"를 사용하여 모든 호출 규칙에서 이름 변환을 방지 할 수 있습니다. 그러나 나는 메시지 상자를 보았을 때 (심지어 충돌이 뒤따라 지더라도) 이름 맹 글링이 당신의 특별한 문제라고 생각하지 않는다. 그렇다면 메시지 상자를 전혀 보지 못했을 것입니다. – ildjarn