GetProcAddress возвращает 0 для всех функций

Прежде всего, да, я искал это некоторое время и не могу найти ответы, относящиеся к моему делу. В основном я пытаюсь получить адрес функции в DLL-библиотеке Windows (dnsapi.dll), а GetProcAddress возвращает 0. Через некоторое время почесывая голову, я даже продолжил создавать программу, которая просто использует GetProcAddress MessageBox в user32. длл. Тот же результат. Вот код второй программы, которую я сделал, которая все еще не работает:

#include <stdio.h>
#include <Windows.h>

int main() {
    HINSTANCE hLib = LoadLibrary(TEXT("user32.dll"));
    DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBox");

    printf("%ld", MsgBoxAddr);
    getchar();

    return 0;
}

Кстати, GetLastError возвращает 127, что, по-видимому, является самой распространенной ошибкой, возвращаемой, когда GetProcAddress не работает, но я не могу понять, что не так, я пробовал со многими функциями и DLL, а не только с этой парой.

Благодарю.:)

РЕДАКТИРОВАТЬ: Связанная статья решила мою проблему, все функции, которые я пробовал, имели версии Unicode и Anis (w и a). Использование полных имен API решило проблемы. Спасибо за ссылку на этот вопрос.

Спасибо.

2 ответа

Некоторые распространенные API не являются настоящими именами функций, в том числе LoadLibrary а также MessageBox, Все эти функции не существуют!

Это связано с тем, что большинство API-интерфейсов Windows, которые принимают текст в качестве параметра, имеют по две версии: одну, которая принимает текст ANSI, а другую - текст UNICODE. Те "функции", которые вы знаете, на самом деле являются макросами препроцессора, которые автоматически направят вас к нужной функции в зависимости от кодировки вашего проекта Visual Studio по умолчанию.

MessageBox например, не существует. Какие существуют функции MessageBoxA а также MessageBoxWодин для ANSI другой для UNICODE. Так вот как вы получите их адрес:

ANSI:

HINSTANCE hLib = LoadLibraryA("user32.dll");
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxA");

UNICODE:

HINSTANCE hLib = LoadLibraryW(L"user32.dll");
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxW");

Автоматический режим:

HINSTANCE hLib = LoadLibrary(TEXT("user32.dll"));
#ifdef UNICODE
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxW");
#else
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxA");
#endif

Хавенард уже дал ответ, поэтому не принимайте мой (но прочитайте его).

Лучший способ решить это - определить:

#ifndef _CRT_STRINGIZE  // Might be already defined in crtdefs.h, but if not...
#define __CRT_STRINGIZE(Value) #Value
#define _CRT_STRINGIZE(Value) __CRT_STRINGIZE(Value)
#endif

а затем использовать

GetProcAddress(hLib, TEXT(_CRT_STRINGIZE(MessageBox)));
Другие вопросы по тегам