Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Название статьи для Context: "Устранение проблемы загрузки библиотеки foo.dll в различных средах выполнения приложений на Delphi"

Delphi , Файловая система , DLL и PlugIns

Устранение проблемы загрузки библиотеки 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, может быть неприемлемо по ряду причин, включая необходимость в полной перекомпиляции и тестировании программы.

Возможные решения

  1. Изменение переменной среды PATH - можно добавить путь к DLL в системную переменную PATH. Это позволит Windows найти DLL в нужной директории, но это решение может быть не самым эстетичным.

pascal SetEnvironmentVariable('PATH', 'C:\fooapp;'+GetEnvironmentVariable('PATH'));

  1. Добавление копии DLL - создание дополнительной копии DLL непосредственно в директорию C:\Program Files\UnwantedStepchild может быть более предпочтительным решением, так как оно позволит избежать изменения системных переменных и будет более локализовано для приложения.

  2. Использование SetDllDirectory - функция SetDllDirectory позволяет расширить путь поиска для LoadLibrary. Это рекомендуемый способ вместо использования SetCurrentDirectory или жесткого указания полного пути к DLL.

pascal SetDllDirectory(PChar('C:\fooapp'));

  1. Изменение текущего каталога - можно изменить текущий каталог на тот, где находится DLL перед вызовом LoadLibrary.

pascal SetCurrentDir('C:\fooapp'); LoadLibrary('foo.dll');

Подтвержденный ответ

Исследование документации MSDN по функции LoadLibrary показывает, что Windows будет искать DLL в текущем каталоге, а также в каталоге, из которого был запущен приложение. Это означает, что для корректной работы необходимо, чтобы текущий каталог был установлен на каталог с DLL, особенно если приложение запускается из разных мест.

Заключение

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

Создано по материалам из источника по ссылке.

Разработчики сталкиваются с проблемой загрузки библиотеки DLL в различных средах выполнения приложений на Delphi, из-за чего возникают ошибки при попытке использования этой библиотеки в приложении, запущенном из другой директории.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:31:28/0.0037260055541992/0