Как использовать DLL вне системного пути
Я сделал приложение, которое использует OpenSSL DLL (libeay32.dll
а также ssleay32.dll
). Я пользуюсь ими, я не звоню напрямую.
Самый простой обходной путь, который я нашел, чтобы избежать установщика (я просто делюпой exe и я в порядке с этим подходом), заключается в следующем:
- положить библиотеки в качестве ресурсов exe
- при запуске программы извлекаю их в папку exe
- exe использует их
Это прекрасно, но я хотел бы улучшить подход, извлекая dll-файлы во временную папку, а не в exe-папку (которая во многих случаях является рабочим столом).
Проблема в том, что я не знаю, как заставить приложение использовать dll в папке temp, потому что теперь поведение таково: если dll не находится в текущем каталоге, попробуйте выполнить поиск в каталогах, определенных в системном пути.
Кто знает решение заставить инди использовать dlls на моем временном пути? (вроде "временно регистрирующихся dll")
3 ответа
Загрузите DLL самостоятельно LoadLibrary
как только вы записали их во временную папку.
Это сделает инди LoadLibrary
используйте ваши библиотеки DLL, когда они нужны:
Если lpFileName не включает путь и существует более одного загруженного модуля с одинаковым базовым именем и расширением, функция возвращает дескриптор модуля, который был загружен первым.
Если вы используете последнюю версию Indy 10, IdSSLOpenSSLHeaders
блок имеет общественное IdOpenSSLSetLibPath()
Функция, которая сообщает Indy, какую пользовательскую папку искать в библиотеках OpenSSL:
procedure IdOpenSSLSetLibPath(const APath: String);
Ты можешь использовать SetDllDirectory
манипулировать порядком поиска DLL.