Что может помешать загрузке DLL с LoadLibrary?
У меня есть бизнес-функция JD Edwards, написанная на Microsoft Visual C++ как модуль C. Я использую LoadLibrary для доступа к сторонним DLL. В автономной тестовой программе код работает просто отлично. Когда я запускаю его изнутри JDE, LoadLibrary возвращает NULL, а GetLastError возвращает 126, что означает The specified module could not be found
в соответствии с MSDN. Я попытался ввести полный путь к DLL, и да, я вспомнил, чтобы удвоить \ символов в пути. Нет разницы.
Я проверил, чтобы убедиться, что нет никаких зависимостей, которые будут препятствовать загрузке DLL; DUMPBIN /DEPENDENTS возвращает следующее:
WSOCK32.dll
USER32.dll
GDI32.dll
WINSPOOL.DRV
ADVAPI32.dll
KERNEL32.dll
Они выглядят как стандартные библиотеки Windows, поэтому я в растерянности.
6 ответов
Отсутствует зависимость? Вы проверили с помощью Dependency Walker, что все указанные библиотеки найдены?
Если вы подключите отладчик во время вызова LoadLibrary, он может выдать информацию об ошибке для отладки вывода. В дополнение к другим предложениям здесь, если в манифесте есть ошибка, эта проблема возникнет.
Я уверен, что это проблема зависимости для вас, хотя. Попробуйте ProcMon, а также попробуйте запустить на Vista, чтобы увидеть, решит ли это проблему. Вы можете получить тестовое изображение VPC здесь.
Я однажды пошел в тот же кошмар. Диагностировать было невозможно, я только что обнаружил, что переустановка пути порядка списка поиска в dll (здесь ключевое слово, вероятно, "список", а не "порядок") устранила проблему.
SetDllDirectory (NULL);
Объяснение состоит в том, что сторонняя DLL в середине, вероятно, возилась с ней, не восстанавливая ее первоначальное состояние. Это может объяснить, почему работало только ваше тестовое приложение.
Кроме того, ходунки Dependency можно запустить с помощью опции профиля. В этом случае исполняемый файл должен быть загружен в ходок зависимостей. После этого можно использовать меню "Профиль".
Затем приложение запускается и дерево DLL заполняется. Это также покажет, если отсутствует задержка загрузки DLL и другие вещи.
Если вы не нашли ответ путем проверки зависимостей, я бы предложил сосредоточиться на возможных проблемах, связанных с архитектурой.
Вы упомянули, что используете автономную тестовую среду, но когда вы пробуете ее в обычной среде, она не работает. Запущена ли настройка бизнес-функции на сервере?
Прошло довольно много времени с тех пор, как я последний раз работал с JDE. Я помню, что однажды я написал BSFN на C, чтобы вызвать несколько UBE в некоторой синхронизации, и это работало на моей локальной машине и не работало, когда я тестировал на сервере. Было что-то, что сервер не мог найти DLL (хотя я указывал путь) и некоторые настройки, которые требовались. Кроме того, была разница, которая была критической в моем случае: на моей машине BSFN ожидал завершения UBE и фиксировал состояние, на сервере - нет, и это также было связано с настройками объектов.,
Опять же, если вы не нашли ничего полезного, попробуйте обратиться за помощью на www.jdelist.com.