在我的例子中,我通过GetProcAddress获得了一个有效导出函数名的函数指针,一旦我的应用程序调用导出函数,它就会在显示输出后崩溃。如果我从函数和typdef中删除参数并直接传递19342" getNumChildShapes(19342)"一切正常,没有任何崩溃。
在我的申请中:
typedef INT (CALLBACK* LPFNDLLFUNC2)(INT modelid);
int codecall()
{
HINSTANCE hDLL;
LPFNDLLFUNC2 lpfnDllFunc2;
INT value = 0;
INT pass = 19342;
hDLL = LoadLibrary(L"myDLL");
if (hDLL != NULL)
{
lpfnDllFunc2 = (LPFNDLLFUNC2)GetProcAddress(hDLL, "get_children");
if (!lpfnDllFunc2)
{
// handle the error
FreeLibrary(hDLL);
return 0;
}
else
{
// call the function
value = lpfnDllFunc2(pass);
}
}
printf("Children: %i", value);
FreeLibrary(hDLL);
return 1;
}
在我的dll中:
extern "C"
{
__declspec(dllexport) int get_children(int modelid)
{
return getNumChildShapes(modelid);
}
}
答案 0 :(得分:3)
从DLL导出的函数将使用C调用约定(__cdecl)进行编译,但函数指针的typedef表示您希望将其视为Windows调用约定(CALLBACK是__stdcall的宏)。混合这两个不平衡的堆栈。
从函数指针声明中删除CALLBACK
,或使用__stdcall声明导出的函数。