我编写了以下代码(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)
。
其他一些评论:
stdcall
和cdecl
。 GetLastError
以获取扩展的错误信息。