Функция GetProcAddress в C ++ - PullRequest
15 голосов
/ 17 мая 2011

Здравствуйте, ребята: я загрузил свою DLL в свой проект, но всякий раз, когда я использую функцию GetProcAddress.возвращается NULL!что я должен делать?Я использую эту функцию (double GetNumber (double x)) в "MYDLL.dll"

Вот код, который я использовал:

typedef double (*LPGETNUMBER)(double Nbr);
HINSTANCE hDLL = NULL;
LPGETNUMBER lpGetNumber;
hDLL = LoadLibrary(L"MYDLL.DLL");
lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");

Ответы [ 3 ]

42 голосов
/ 17 мая 2011

Проверка кодов возврата и вызов GetLastError() освободит вас.Вы должны проверить коды возврата дважды здесь.Вы фактически проверяете коды возврата ноль раз.

hDLL = LoadLibrary(L"MYDLL.DLL");

Проверка hDLL.Это NULL?Если это так, позвоните GetLastError(), чтобы узнать, почему.Это может быть так же просто, как «Файл не найден».

lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");

Если lpGetNumber НЕДЕЙСТВИТЕЛЕН, вызовите GetLastError().Он скажет вам, почему не удалось найти адрес proc.Существует несколько вероятных сценариев:

  1. Не существует экспортируемой функции с именем GetNumber
  2. Существует экспортированная функция с именем GetNumber, но онане помечено extern "c", в результате искажение имени .
  3. hDLL не является допустимым дескриптором библиотеки.

Если оно окажется #1 выше, вам нужно экспортировать функции, декорировав объявление с помощью __declspec(dllexport) следующим образом:

MyFile.h

__declspec(dllexport) int GetNumber();

Если это окажется # 2 выше, вам нужноДля этого:

extern "C"
{
  __declspec(dllexport) int GetNumber();
};
2 голосов
/ 04 ноября 2015

Возможно, вы захотите проверить, экспортируется ли ваша функция GetNumber как функция __stdcall.

Если это так, попробуйте GetProcAddress(hDLL, "_GetNumber@N");, где N - общее количество байтов списка аргументов GetNumber.Например, если ваша сигнатура функции int GetNumber(int a, double b), ее настоящее имя в DLL будет _GetNumber@12.

Ссылка: __stdcall

2 голосов
/ 17 мая 2011

Скорее всего LoadLibrary() не удалось.Вы просто не видите этого, потому что, по-видимому, вы не проверяете, что он возвращает:

Если функция завершается ошибкой, возвращаемое значение равно NULL.Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

РЕДАКТИРОВАТЬ:

Мы не знаем, как вы экспортируете функцию в код DLL, но этот поток объясняет пару причин, по которым GetProcAddress не работает.

...