Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ LoadLibrary(';user32.dll';)返回14007_C++_Crash_User32 - Fatal编程技术网

C++ LoadLibrary(';user32.dll';)返回14007

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

如果我尝试使用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 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