임포트 된 함수를 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
}
을 당신은 당신이 잘못 할 때 도움을 컴파일러가 없습니다. 당신이 잘못 본 것 같아서, 그것은 매우 __stdcall 보이지 않습니다. 그렇지 않으면 디버거를 사용하지 않을 이유가 없습니다. –
이 함수는 cdecl입니다. 왜 stdcall을 사용 했습니까? 당신은 init (test)를 작성할 수 없습니까? 문제는 DLL에 있습니다. MCVE를 만드는 것을 고려하십시오. –
* "그러나 나는 __declspec (dllimport) 대신에'GetProcAdress'를 사용하고 싶습니다."* - 왜 그렇게 될까요? 필요한 것은 언제이고 어떻게 가져 오기가 처리되는지에 대한 제어가 필요한 경우 [지연로드] (https://msdn.microsoft.com/en-us/library/151kt790.aspx)를 사용하고 코드 ([도우미 기능 이해] (https://msdn.microsoft.com/en-us/library/09t6x5ds.aspx) 참조). – IInspectable