Я хочу скопировать зависимости (пару файлов DLL) в отдельный подкаталог. После установки моей программы структура каталогов будет выглядеть так:
Соответствующая часть моего сценария выглядит следующим образом:
[Dirs]
Name: "{app}\sample"Name: "{app}\dll"[Files]
Source: "pg.exe"; DestDir: "{app}"; Flags: ignoreversion
; icon file
;Source: "pg.ico"; DestDir: "{app}"; sample ini and geoemtry file
Source: "geometry.xml"; DestDir: "{app}\sample"Source: "ini.xml"; DestDir: "{app}\sample"
; DLL
Source: "a.DLL"; DestDir: "{app}\dll"; Flags: onlyifdoesntexist
Source: "b.DLL"; DestDir: "{app}\dll"; Flags: onlyifdoesntexist
Когда я тестирую мой установщик в виртуальной машине, я получаю сообщение об ошибке, в котором говорится, что a.DLL не найден. Проблема быстро решается, если я просто копирую a.DLL
от dll/
в каталог исполняемого файла.
Если вы используете неявное связывание DLL, то существует только несколько каталогов
где вы можете разместить необходимые файлы DLL. Если предположить, SafeDllSearchMode
включен (это значение по умолчанию начиная с Windows XP SP2), загрузчик Windows выполняет поиск DLL в следующем порядке:
Для получения дополнительной информации о порядке поиска см. https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx
Если вы используете этот тип связи, я бы посоветовал вам поместить ваши DLL в
тот же каталог, что и ваш исполняемый файл.
С другой стороны, если вы явно ссылаетесь на эти DLL с помощью LoadLibrary
или же
LoadLibraryEx
API, вот что вы можете сделать:
AddDllDirectory
и передайте ему путь к каталогу, который содержит вашLoadLibraryEx
с флагом LOAD_LIBRARY_SEARCH_USER_DIRS
,GetModuleFileName
функция, тоLoadLibrary(Ex)
,SetDllDirectory
перед звонком LoadLibrary(Ex)
, Проблема с этимSetDllDirectory
функция вызывается, она заменяет каталогSetDllDirectory
вызов. Это может вызвать проблемы, если вы не будете осторожныSetDllDirectory
и вызвать сбой при загрузке ваших DLLДругих решений пока нет …