【发布时间】:2015-12-14 22:22:46
【问题描述】:
我编写了以下代码(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 和一个 GetLastError() 在它返回 0x0000007f 之后调用,这意味着 ERROR_PROC_NOT_FOUND,但我定义了 proc!
为什么会这样? GetProcAddress() 不应该与GetModuleHandle() 一起使用吗?
【问题讨论】:
-
如果
GetModuleHandle()成功了,你为什么在GetModuleHandle()之后阅读GetLastError()? -
Format of a C Decorated Name:“注意,在 64 位环境中,函数不会被修饰。”
-
GetLastError仅应在您确定某事失败后使用,并且如果该“某事”被记录为以这种方式返回更多信息。在所有其他时间,它的结果都是无用的。 -
退后一步,你想解决什么问题。我准备打赌这不是解决方案。
-
@molbdnilo:“失败” 不是调用
GetLastError的先决条件。例如,您可以在调用CreateMutex 成功后调用GetLastError。
标签: c++ winapi runtime-error