2013-09-25 2 views
0

Мне нужно использовать libcurl.dll в моей программе (двоичная ссылка на libcurl.dll в моей программе - «A.exe»), libcurl.dll полагаться на zlib1.dll, libeay32.dll , ssleay32.dll. , но есть еще одна версия libeay32.dll, которая уже существует в папке A.exe. Итак, я планирую создать папку «CURL», на которой на этот раз поместил новую 4 DLL, а затем использовал динамическую загрузку DLL для вызова libcurl.dll.windows C++ DLL динамическая нагрузка

=====================

 
Main folder 

| 

A.exe, 

libeay32.dll(old one), 

Folder "CURL" ----- 

        | 
        | 
       libcurl.dll, zlib1.dll, libeay32.dll, ssleay32.dll 

===================== 

Вопрос в том, что как я могу контролировать свою программу, чтобы загрузить DLL в папку «CURL» , Я могу контролировать загрузку «A.exe» CURL \ libcurl.dll по вызову

HMODULE hModule = LoadLibrary (_T ("Curl \ libcurl.dll")); Но как я могу контролировать путь zlib1.dll, libeay32.dll, ssleay32.dll. Кажется, что окна ищут DLL в папке, где A.exe локальный по умолчанию.

+0

Я нахожу решение, которое может работать на ОС высокой версии. загрузите DLL, используя: LoadLibraryEx («FullPathofA.exe», NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_DEFAULT_DIRS); Есть ли способ работы с низкой версией ОС. Windows 7, Windows Server 2008 R2, Windows Vista и Windows Server 2008: для этого значения требуется установить KB2533623. Windows Server 2003 и Windows XP: это значение не поддерживается. – Leon

+0

Я не думаю, что эта схема будет работать: 'libeay32.dll' уже загружен, поэтому он не будет загружен снова - даже если версии будут отличаться! – MSalters

+0

@MSalters Но что, если он загружает правильную версию libeay32.dll, как я уже сказал, перед загрузкой libcurl.dll? – SamuelVimes

ответ

0

Используйте параметры каталогов вашего компилятора. или/и использовать логику Windows для поиска зависимых dll. (Вы можете использовать инструменты как filemon или process monitor, чтобы увидеть, какие каталоги будут смотрены вверх)

Используйте путь поиска окон. Заказ:

  1. Адрес, в котором находится исполняемый модуль для текущего процесса.

  2. Текущий каталог.

  3. Системный каталог Windows. Функция GetSystemDirectory возвращает путь к этому каталогу.

  4. Каталог Windows. Функция GetWindowsDirectory возвращает путь к этому каталогу.

  5. Каталоги, перечисленные в переменной среды PATH.

+0

Я думаю, что вы неправильно поняли мой вопрос, я знаю последовательность, в которой окна ищут DLL. Я хочу добавить свою папку «CURL» в список поиска и сделать первый поиск окон для DLL. – Leon

+0

oke sorry, какой OS/IDE/компилятор вы используете? – lordkain

0

Вы должны быть в состоянии загрузить его с LoadLibrary если вы указываете полный путь к DLL, а не относительным в вызове. При использовании только имени файла или относительного пути порядок поиска определяется, как указано в файле lordKain (если вы не изменяете его, например, вызывая SetDllDirectory), но при использовании полного пути он должен искать только в указанном месте. Вы можете загрузить таким образом версию libeay32.dll, которая вам нужна, чтобы при загрузке libcurl.dll уже была загружена версия libeay32.dll, которую вы хотите. Также будьте осторожны, чтобы не было манифеста перенаправления dll.

Смежные вопросы