2016-09-05 11 views
2

임포트 된 함수를 DLL에서 호출하려면 GetProcAddress을 통해 함수 포인터를 잡아서 함수를 호출 할 때 응용 프로그램이 충돌합니다.C++ WINAPI GetProcAddress를 통해 내 보낸 함수를 호출하십시오.

dependencywalker를 사용하여 내 보낸 함수의 이름이 올바른지 확인했습니다. GetProcAddress에서 반환 된 주소가 null이 아닙니다. 나는 이것이 호출 규칙과 관련이 있다는 것을 거의 확신한다. 나는 __cdecl__stdcall을 모두 사용했지만 성공하지 못했다. 그러나 __declspec(dllimport) 대신 GetProcAdress을 사용하고 싶습니다.

DLL # 1 (발신자)이 DLL에

  • 연결된 DLL # 1 2.lib

    typedef void(__stdcall *ptr_init)(DWORD size); 
    
    ctx.hModule = LoadLibraryA("someDLL.dll"); 
    ptr_init init = (ptr_init)GetProcAddress(ctx.hModule, "init"); 
    
    if (init == NULL) { 
        out = out + " | init function is null"; 
    } else { 
        out = out + " | init function found!";//It is found 
    } 
    
    DWORD test = 10; 
    (*init)(test);//<-- makes application crash 
    

DLL # 2 (DLL 함유 익스포트 기능)

//header.h 
extern "C" __declspec(dllexport) void init(DWORD size); 

//source.cpp 
extern "C" __declspec(dllexport) void init(DWORD size) { 
    //code 
} 
+2

을 당신은 당신이 잘못 할 때 도움을 컴파일러가 없습니다. 당신이 잘못 본 것 같아서, 그것은 매우 __stdcall 보이지 않습니다. 그렇지 않으면 디버거를 사용하지 않을 이유가 없습니다. –

+0

이 함수는 cdecl입니다. 왜 stdcall을 사용 했습니까? 당신은 init (test)를 작성할 수 없습니까? 문제는 DLL에 있습니다. MCVE를 만드는 것을 고려하십시오. –

+0

* "그러나 나는 __declspec (dllimport) 대신에'GetProcAdress'를 사용하고 싶습니다."* - 왜 그렇게 될까요? 필요한 것은 언제이고 어떻게 가져 오기가 처리되는지에 대한 제어가 필요한 경우 [지연로드] (https://msdn.microsoft.com/en-us/library/151kt790.aspx)를 사용하고 코드 ([도우미 기능 이해] (https://msdn.microsoft.com/en-us/library/09t6x5ds.aspx) 참조). – IInspectable

답변

3

당신은 일관성이 있어야합니다. 당신이 stdcall 함수에 대한 포인터로 포인터를 검색 할 경우 -이 구현 stdcall로 선언해야합니다 :

//header.h 
extern "C" __declspec(dllexport) void __stdcall init(DWORD size); 
+0

'__stdcall'은 응용 프로그램을 중단 시키지만 모든'__stdcall' 작업을 제거합니다, 왜 그럴까요? – MircoProgram

+0

이 함수는 DLL 코드에서'__cdecl'로 선언 되었기 때문에. –