Функция GetProcAddress в С++

Привет, ребята: я загрузил свою DLL в свой проект, но всякий раз, когда я использую функцию GetProcAddress. он возвращает NULL! что мне делать? Я использую эту функцию (двойной 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");

Ответы

Ответ 1

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

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

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

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

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

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

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

MyFile.h

__declspec(dllexport) int GetNumber();

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

extern "C"
{
  __declspec(dllexport) int GetNumber();
};

Ответ 2

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

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

EDIT:

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

Ответ 3

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

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

Ссылка: __ stdcall