c++ - 为什么此代码不起作用(请参阅详细信息)?

标签 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的地址,然后调用它。 由于某些奇怪的原因,在 GetModuleHandle() 之后调用 GetLastError() 返回 0x00000032 这意味着 ERROR_NOT_SUPPORTED,但它确实返回一些非零值,我认为它是可执行文件的句柄。 GetProcAddress() 返回 0x0000000000000000 并在返回 0x0000007f 后调用 GetLastError(),这意味着 ERROR_PROC_NOT_FOUND,但我定义了过程!

为什么会发生这种情况? GetProcAddress() 是否不应与 GetModuleHandle() 一起使用?

最佳答案

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

其他一些评论:

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

关于c++ - 为什么此代码不起作用(请参阅详细信息)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34267930/

相关文章:

c++ - 了解哪款显示器在 Windows 10 上具有触摸功能

java - 我收到运行时异常,但不知道是什么原因造成的

c++ - 删除指向自动变量的指针

c++ - 任何使用类 typedef 但不包含该类的头文件的方法?

c++ - 复制构造函数混淆

winapi - 用于虚拟内存管理的新 Windows 8.1 API : `DiscardVirtualMemory()` vs `VirtualAlloc()` and `MEM_RESET` and `MEM_RESET_UNDO`

使用 FindFirstFile/FindNextFile 删除文件夹中所有文件的 C++ 代码

java - 为什么这会导致 ArrayIndexOutOfBoundsException?

c++ - 使用 GUI 和工作线程提升 Asio 模式

c++ - C++ 中的谓词是什么?