c ++ WINAPI通过GetProcAddress调用导出函数

时间:2016-09-05 12:43:16

标签: c++ winapi dll dllexport getprocaddress

我试图通过GetProcAddress抓取其函数指针来调用DLL中的导出函数,但在调用该函数时,应用程序崩溃了。

我使用dependencywalker查看导出的函数是否具有正确的名称。从GetProcAddress返回的地址不为空。我几乎肯定它与调用约定有关,我同时使用__cdecl__stdcall但没有成功。不过我确实希望使用GetProcAdress代替__declspec(dllimport)

DLL#1(来电者)

  • 将DLL#2.lib链接到此DLL

    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
}

1 个答案:

答案 0 :(得分:3)

你应该保持一致。如果检索指针作为指向CASE WHEN UPPER(Title) CONTAINS(', THE') THEN CONCAT('THE ', regexp_replace(Title, r', THE\s*\z', r'')) ELSE UPPER(Title) end as title_s, 函数的指针 - 它必须在实现中声明为stdcall

stdcall