如果我尝试使用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也不起作用
答案 0 :(得分:0)
在64位系统上,地址是64位宽。 DWORD
类型是" 32位无符号整数" (引自this MSDN type reference)。
这意味着您截断您从GetProcAddress
收到的地址,使其无效。
解决方案是使用适当的指针类型,转换为该类型而不是DWORD
。也许像是
__MessageBoxA MsgBox = (__MessageBoxA) GetProcAddress(hUserModule, "MessageBoxA");
(假设__MessageBoxA
是一个正确的指针。)