Как использовать dll вне пути к системе

Я сделал приложение, которое использует dlls openssl (libeay32.dll и ssleay32.dll). Я использую их, я не вызываю DLL напрямую.

Простейший обходной путь, который я нашел, чтобы избежать установки (я просто delpoy exe, и я в порядке с этим подходом):

  • поместите dll в качестве ресурсов exe
  • при запуске программы я извлекаю их в папку exe
  • exe использует их

Это идеально, но я хотел бы улучшить подход, извлекая DLL в папку temp, а не в папку exe (что во многих случаях является рабочим столом).

Проблема в том, что я не знаю, как заставить приложение использовать DLL в папке temp, потому что теперь это поведение: если dll не находятся в текущем каталоге, попробуйте выполнить поиск в каталогах, определенных в системном пути.

Кто знает решение заставить indy использовать DLL в моем временном пути? (например, "временная регистрация DLL" )

Ответы

Ответ 1

Загрузите библиотеки DLL с помощью LoadLibrary, как только вы написали их в папку temp.
Это заставит Indy LoadLibrary использовать ваши библиотеки DLL, когда они им понадобятся:

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

Ответ 2

Если вы используете обновленную версию Indy 10, блок IdSSLOpenSSLHeaders имеет общедоступную функцию IdOpenSSLSetLibPath(), чтобы сообщить Indy, какую пользовательскую папку искать в DLL OpenSSL:

procedure IdOpenSSLSetLibPath(const APath: String);

Ответ 3

Вы можете использовать SetDllDirectory для управления порядком поиска DLL.