LoadLibrary (‘user32.dll’) возвращает 14007

Если я пытаюсь использовать 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

Решение

В 64-битной системе адреса имеют ширину 64 бита. DWORD тип «32-разрядное целое число без знака» (цитируется этот тип ссылки MSDN).

Это означает, что вы усекать адрес, с которого вы получаете GetProcAddress делая его недействительным.

Решение состоит в том, чтобы использовать правильный тип указателя, приводя к этому типу вместо DWORD, Возможно что-то вроде

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

(Предполагается, что __MessageBoxA является правильный указатель.)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]