1

我对 GetProcAddress 有疑问:我编写了一个简单的 DLL,其中只有一个函数:

extern "C" LRESULT WINAPI Function(HWND Hwnd, UINT Message,
                                   WPARAM wParam, LPARAM lParam)
{
    Beep(1000, 1000);
    return CallNextHookEx(0, Message, wParam, lParam);
}

当我尝试获取函数的地址时,GetProcAddress 失败并显示 ErrorCode 127 (ERROR_PROC_NOT_FOUND)。但是,如果我使用 void 作为函数类型,它可以完美地工作。我真的不明白为什么它会这样。任何建议将不胜感激!

顺便说一句:DependencyWalker 显示该函数的名称确实是“Function”,没有应用任何更改。

4

2 回答 2

4

GetProcAddress 只有两种失败模式:

  • 你没有导出函数
  • 你的名字不对

此函数的导出名称不是“函数”,除非您使用 .def 文件重命名导出或创建 64 位 DLL。对于 32 位版本,它将是“_Function@16”。@16 后缀与您无法使其适用于具有任何参数的函数这一事实密切相关。

从 Visual Studio 命令提示符对 DLL 运行 Dumpbin.exe /exports 以查看导出。删除同一目录中的 .pdb 文件(如果有)。

于 2011-06-30T22:02:58.540 回答
2

使用带有导出函数名称的模块定义(.def 文件)而不是 __declspec(dllexport) 是个好主意。管理它们要容易得多。

还有这个

#define DllExport extern "C" __declspec (dllexport)

导致导出的 dll 函数名称没有任何 c++“装饰”的原因

于 2012-09-10T11:10:01.913 回答