Как использовать 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.