C++ LoadLibrary(';user32.dll';)返回14007
如果我尝试使用LoadLibrary加载User32.dll,函数将返回错误14007(错误\u SXS\u KEY\u NOT\u FOUND)。这是我使用的代码:C++ LoadLibrary(';user32.dll';)返回14007,c++,crash,user32,C++,Crash,User32,如果我尝试使用LoadLibrary加载User32.dll,函数将返回错误14007(错误\u SXS\u KEY\u NOT\u FOUND)。这是我使用的代码: SetLastError(0); //To make sure there are no previous errors. HINSTANCE hUserModule = LoadLibrary(L"User32.dll"); if (hUserModule == NULL) { //Checking if hUserModule
SetLastError(0); //To make sure there are no previous errors.
HINSTANCE hUserModule = LoadLibrary(L"User32.dll");
if (hUserModule == NULL) { //Checking if hUserModule is NULL
MessageBoxA(NULL, "Fatal error", "", 16);
ExitProcess(0);
} //hUserModule is not NULL
printf("%d\n", GetLastError()); //14007
DWORD paMessageBoxA = (DWORD)GetProcAddress(hUserModule, "MessageBoxA");
__MessageBoxA MsgBox = (__MessageBoxA)paMessageBoxA; //typedef int(__stdcall *__MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT);
MsgBox(NULL, "", "", 64); //Application crahses
因此hUserModule不是NULL,但也是无效的。为什么会这样
编辑:GetModuleHandle在64位系统上也不起作用。地址为64位宽。DWORD的类型是“32位无符号整数”(引用自) 这意味着您将截断接收到的地址,使其无效 解决方案是使用适当的指针类型,转换为该类型,而不是转换为
DWORD
。也许像
__MessageBoxA MsgBox = (__MessageBoxA) GetProcAddress(hUserModule, "MessageBoxA");
(假设MessageBoxA是正确的指针。)在64位系统上,地址是64位宽的。DWORD的类型是“32位无符号整数”(引用自) 这意味着您将截断接收到的地址,使其无效 解决方案是使用适当的指针类型,转换为该类型,而不是转换为
DWORD
。也许像
__MessageBoxA MsgBox = (__MessageBoxA) GetProcAddress(hUserModule, "MessageBoxA");
(假设
\uuu MessageBoxA
是一个正确的指针。)通常,只有在函数失败时,才应该检查错误代码(由GetLastError
返回)。否则,您可能会得到误报。至于崩溃,您是否检查了GetProcAddress
是否没有失败?最后,这与您的问题完全无关,但不要使用以双下划线开头的符号。这些是“实现”(编译器和标准库)在所有范围内保留的。有关详细信息,没有任何内容阻止LoadLibrary
使用可能调用SetLastError
的其他函数(内部)。当文档中描述了GetLastError
中的值有效时,它返回了错误代码0。通常,只有在函数失败时,才应检查错误代码(由GetLastError
返回)。否则,您可能会得到误报。至于崩溃,您是否检查了GetProcAddress
是否没有失败?最后,这与您的问题完全无关,但不要使用以双下划线开头的符号。这些是“实现”(编译器和标准库)在所有范围内保留的。有关详细信息,没有任何内容阻止LoadLibrary
使用可能调用SetLastError
的其他函数(内部)。当GetLastError
中的值有效时,文档中进行了描述。我这样做了,它返回了错误代码0