为什么这段代码不起作用(请参阅详情)?

时间:2015-12-14 13:10:25

标签: c++ winapi runtime-error

我编写了以下代码(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()一起使用吗?

2 个答案:

答案 0 :(得分:2)

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

其他一些评论:

  1. 您似乎与调用约定stdcallcdecl不匹配。
  2. 您不执行任何错误检查。对于这些特定功能,您需要检查返回值。如果这表明函数已失败,则调用GetLastError以获取扩展错误信息。

答案 1 :(得分:0)

应该是:

extern "C" __declspec(dllexport) void foo0(void* v) { int a = 0; }

foo f = (foo)GetProcAddress(hmod, "foo0");
                                  ^^~~~ no need for underline

关于你的GetLastError问题,我不确定 - 我想它可能是一些随机值。