Если я пытаюсь использовать 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 также не работает
В 64-битной системе адреса имеют ширину 64 бита. DWORD
тип «32-разрядное целое число без знака» (цитируется этот тип ссылки MSDN).
Это означает, что вы усекать адрес, с которого вы получаете GetProcAddress
делая его недействительным.
Решение состоит в том, чтобы использовать правильный тип указателя, приводя к этому типу вместо DWORD
, Возможно что-то вроде
__MessageBoxA MsgBox = (__MessageBoxA) GetProcAddress(hUserModule, "MessageBoxA");
(Предполагается, что __MessageBoxA
является правильный указатель.)
Других решений пока нет …