通过GetProcAddress提取的函数指针会使应用程序崩溃

时间:2015-12-11 13:58:21

标签: c++

在我的例子中,我通过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);
    }
}

1 个答案:

答案 0 :(得分:3)

从DLL导出的函数将使用C调用约定(__cdecl)进行编译,但函数指针的typedef表示您希望将其视为Windows调用约定(CALLBACK是__stdcall的宏)。混合这两个不平衡的堆栈。

从函数指针声明中删除CALLBACK,或使用__stdcall声明导出的函数。