Устранение проблемы загрузки библиотеки foo.dll в различных средах выполнения приложений на Delphi
Иногда разработчики сталкиваются с проблемой загрузки динамических библиотек (DLL) в разных средах выполнения приложений. В частности, рассматривается ситуация, когда две программы на Delphi используют одну и ту же библиотеку foo.dll для инъекции клиентского сертификата в SOAP-запрос. Библиотека расположена в директории C:\fooapp\foo.dll и обычно загружается программой C:\fooapp\foo.exe, что работает без ошибок. Однако, в случае с другой программой C:\Program Files\UnwantedStepchild\sadapp.exe, загрузка библиотеки терпит неудачу, так как DLL не находится в текущем каталоге.
Пример кода загрузки DLL
FOOLib := LoadLibrary('foo.dll'); // Попытка загрузки DLL
...
If FOOLib <> 0 then
begin
FOOProc := GetProcAddress(FOOLib, 'xInjectCert');
FOOProc(myHttpRequest, Data, CertName);
end;
Проблема
При выполнении программы sadapp.exe загрузка библиотеки не происходит, FOOLib возвращает 0, и дальнейшее выполнение кода не происходит. Это приводит к тому, что сертификат не инжектится, и в тестах против продакшн-сервера возникают ошибки подключения. Решение проблемы, которое заключается в указании полного пути к DLL, может быть неприемлемо по ряду причин, включая необходимость в полной перекомпиляции и тестировании программы.
Возможные решения
Изменение переменной среды PATH - можно добавить путь к DLL в системную переменную PATH. Это позволит Windows найти DLL в нужной директории, но это решение может быть не самым эстетичным.
Добавление копии DLL - создание дополнительной копии DLL непосредственно в директорию C:\Program Files\UnwantedStepchild может быть более предпочтительным решением, так как оно позволит избежать изменения системных переменных и будет более локализовано для приложения.
Использование SetDllDirectory - функция SetDllDirectory позволяет расширить путь поиска для LoadLibrary. Это рекомендуемый способ вместо использования SetCurrentDirectory или жесткого указания полного пути к DLL.
pascal
SetDllDirectory(PChar('C:\fooapp'));
Изменение текущего каталога - можно изменить текущий каталог на тот, где находится DLL перед вызовом LoadLibrary.
Исследование документации MSDN по функции LoadLibrary показывает, что Windows будет искать DLL в текущем каталоге, а также в каталоге, из которого был запущен приложение. Это означает, что для корректной работы необходимо, чтобы текущий каталог был установлен на каталог с DLL, особенно если приложение запускается из разных мест.
Заключение
Выбор метода решения проблемы зависит от конкретной ситуации и предпочтений разработчика. Важно учитывать, что некоторые решения могут повлиять на другие приложения или процессы в системе. Рекомендуется тщательно взвесить все "за" и "против" перед внесением изменений в систему.
Разработчики сталкиваются с проблемой загрузки библиотеки DLL в различных средах выполнения приложений на Delphi, из-за чего возникают ошибки при попытке использования этой библиотеки в приложении, запущенном из другой директории.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.