我编写了以下代码(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()
一起使用吗?
答案 0 :(得分:2)
代码失败,因为GetProcAddress
要求从相关模块导出提供的符号。也就是说,该符号必须已在PE模块的导出表中列出。您不导出符号,因此GetProcAddress
无法找到它。因此GetProcAddress
会返回NULL
。如果您希望使用GetProcAddress
,则必须导出该符号。通过在.def文件中命名,或使用__declspec(dllexport)
。
其他一些评论:
stdcall
和cdecl
不匹配。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问题,我不确定 - 我想它可能是一些随机值。