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

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

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

  1. положить библиотеки в качестве ресурсов exe
  2. при запуске программы извлекаю их в папку exe
  3. 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.

Другие вопросы по тегам