GetProcAddress不适用于void以外的函数

时间:2011-06-30 20:48:02

标签: windows-7 dllimport getprocaddress

我遇到GetProcAddress问题: 我写了一个简单的DLL,里面只有一个函数:

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

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

BTW:DependencyWalker显示函数的名称确实是“Function”,没有应用任何更改。

2 个答案:

答案 0 :(得分:4)

GetProcAddress只有两种失败模式:

  • 您没有导出功能
  • 你没有得到正确的名字

除非您使用.def文件重命名导出或创建了64位DLL,否则此函数的导出名称不是“函数”。对于32位版本,它将是“_Function @ 16”。 @ 16后缀与你无法使用任何参数的函数有很大关系。

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

答案 1 :(得分:2)

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

也是这个

#define DllExport extern "C" __declspec (dllexport)

导致导出的dll函数名称没有任何c ++“decorations”