LoadLibrary('user32.dll')返回14007

时间:2017-06-29 10:59:17

标签: c++ crash user32

如果我尝试使用LoadLibrary加载User32.dll,则该函数返回错误14007(ERROR_SXS_KEY_NOT_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也不起作用

1 个答案:

答案 0 :(得分:0)

在64位系统上,地址是64位宽。 DWORD类型是" 32位无符号整数" (引自this MSDN type reference)。

这意味着您截断您从GetProcAddress收到的地址,使其无效。

解决方案是使用适当的指针类型,转换为该类型而不是DWORD。也许像是

__MessageBoxA MsgBox = (__MessageBoxA) GetProcAddress(hUserModule, "MessageBoxA");

(假设__MessageBoxA 一个正确的指针。)