GetProcAddress возвращает NULL

Я пытаюсь загрузить DLL, используя LoadLibrary и GetProcAddress. LoadLibrary возвращает допустимый дескриптор, но мои вызовы GetProcAddress возвращают NULL. Вызов GetLastError возвращает 87, которое равно ERROR_INVALID_PARAMETER. Я проверил, что имя функции, которую я передаю GetProcAddress, совпадает с именем, возвращаемым при запуске dumpbin /exports на длл. К сожалению, это для работы, поэтому я не могу включить фактический код. Но вот отредактированная версия, чтобы дать вам представление о том, что я делаю.

HINSTANCE hDLL = NULL;

hDLL = LoadLibrary(L"<PATH TO DLL>");

if (hDLL == NULL)
{
    // error handling code
}

g_var1 = (VAR1_TYPE) GetProcAddress(hDLL, L"Function1Name");
g_var2 = (VAR2_TYPE) GetProcAddress(hDLL, L"Function2Name");

if (!g_var1 ||
    !g_var2 )
{
    // error handling code
}

Я рассмотрел ряд связанных вопросов на SO и других форумах, но, как правило, проблема связана с искажением имен в C++. Так как я использую то же имя, что и dumpbin показывает, что я не думаю, что это моя проблема. Есть идеи?

ОБНОВИТЬ

Я думаю, что я, возможно, сузил проблему. На цели существует более старая версия этой библиотеки DLL (это встроенное решение WinCE). Но мне нужно использовать более новую версию DLL, которая имеет некоторые дополнительные функции, которые мне нужны; Unfortuanatley Я не могу обновить старую DLL. Эта новая dll и приложение, использующее dll, упакованы в файл cab, который загружается в цель. Я попытался GetProcAddress с парой функций в старой DLL, и те работали. Таким образом, кажется, что хотя я вызываю LoadLibrary с путем к новой DLL, на самом деле это просто загрузка DLL, которая уже находится на цели. Кто-нибудь может подтвердить, что это то, что произойдет?

ОТВЕТЬТЕ НА ПРЕДЫДУЩИЙ ВОПРОС

Когда Windows CE загружает DLL, вся информация о пути игнорируется при определении, если DLL уже загружена. Это означает, что DLL с тем же именем, но другим путем может быть загружена только один раз. Кроме того, модуль, заканчивающийся расширением.cpl, рассматривается как расширение.dll.

Источник: http://msdn.microsoft.com/en-us/library/ms886736.aspx

1 ответ

Решение

Да, это распространенная ошибка. Если вы не укажете полный путь к DLL, LoadLibrary вернет дескриптор уже загруженной DLL с тем же именем.

Из MSDN:

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

Я считаю, что вы можете получить именно ту библиотеку DLL, которая вам нужна, указав абсолютный путь к LoadLibrary.

Другие вопросы по тегам