WINAPI通过GetProcAddress调用导出函数

c++ WINAPI call exported function via GetProcAddress

本文关键字:函数 调用 通过 GetProcAddress WINAPI      更新时间:2023-10-16

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

我使用dependencywalker来查看导出的函数是否有正确的名称。从GetProcAddress返回的地址不为空。我几乎可以肯定这与调用约定有关,我使用了__cdecl__stdcall但没有成功。但是,我确实想使用GetProcAdress而不是__declspec(dllimport)

DLL #1(调用者)

  • 链接DLL # 2。

    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函数的指针-它必须在实现中声明为stdcall:

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