Функция 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