我编写了以下代码(x64 VS 2015):

typedef void(__stdcall *foo)(void* v);
HMODULE hmod = GetModuleHandle(NULL);
foo f = (foo) GetProcAddress(hmod, "_foo0");
f(0);
foo0定义为:
extern "C" void __stdcall foo0(void* v){int a = 0;}

我已禁用所有优化和安全检查。

我想要代码做的是找到foo0的地址,然后调用它。
出于某种奇怪的原因,在GetLastError()之后调用GetModuleHandle()返回0x00000032,这意味着ERROR_NOT_SUPPORTED,但它确实返回了一些非零值,我认为这是可执行文件的句柄。 GetProcAddress()返回0x0000000000000000并返回GetLastError()调用,之后返回0x0000007f,这意味着ERROR_PROC_NOT_FOUND,但我定义了proc!

为什么会这样呢?不应将GetProcAddress()GetModuleHandle()一起使用吗?

最佳答案

该代码失败,因为GetProcAddress要求提供的符号已从相关模块中导出。也就是说,该符号必须已在PE模块的导出表中列出。您没有导出符号,因此GetProcAddress找不到它。因此GetProcAddress返回NULL。如果要使用GetProcAddress,则必须导出符号。通过将其命名为.def文件,或者使用__declspec(dllexport)

其他一些评论:

  • 您似乎不符合调用约定stdcallcdecl
  • 您不执行任何错误检查。对于这些特定功能,您需要检查返回值。如果那表明函数已失败,则调用GetLastError以获取扩展的错误信息。
  • 08-26 00:24