我编写了以下代码(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)
。
其他一些评论:
- 您的调用约定
stdcall
和cdecl
似乎不匹配。 - 您不执行任何错误检查。对于这些特定函数,您需要检查返回值。如果这表明该函数失败,则调用
GetLastError
获取扩展错误信息。
关于c++ - 为什么此代码不起作用(请参阅详细信息)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34267930/