Вызов последовательных DLL из {tmp} в Inno Setup
Я хочу использовать библиотеку DLL (скажем, "A.dll"), которую я создал в Delphi, в моем сценарии установки Inno, который использует несколько других библиотек DLL ("B.dll", "C.dll", ...). Все эти dll-файлы включены в раздел Files следующим образом:
[Files]
Source:"libs\*.dll"; Flags: dontcopy
В разделе кода я объявляю методы используемой DLL, как описано в интерактивной справке, и добавляю флаг loadwithalteredsearchpath:
procedure MyMethod; external 'MyMethod@files:A.dll,B.dll,C.dll stdcall loadwithalteredsearchpath';
Когда запускается установщик, все необходимые файлы копируются во временный каталог, на который указывает константа {#tmp}. Тем не менее, MyMethod начинает свое выполнение очень хорошо (проверил его с некоторыми Showmessages), но все это ломается, когда метод пытается использовать другие библиотеки DLL.
Рядом с временной папкой из {#tmp} во время установки создаются две другие временные директории (все с шаблоном "IS-xxxxx.tmp"), которые содержат "setup.tmp" (чего нет в {#tmp}). Когда я сейчас вручную копирую все библиотеки DLL (кроме A.dll) в обе эти директории в начале установки, тогда все работает нормально. Но когда я запускаю его только так, как определено в моем скрипте, A.dll, похоже, не находит другие библиотеки.
Кто-нибудь знает, почему это происходит и как я могу это исправить? Кажется, это проблема с PATH, но я подумал, что Inno Setup добавляет tmp-dir в PATH, чтобы программа установки могла найти библиотеки DLL (что и происходит, но, как ни странно, только для A.dll).
Заранее спасибо за помощь!:)
РЕДАКТИРОВАТЬ: Фактическая ошибка, которую я получаю, когда я использую одну из "чужих" DLL (B.dll, C.dll, ...), вызывая один из их методов внутри A.dll во время установки Inno:
Access violation at address 00408CC7 in module 'setup.tmp'. Read of adress 00000000.
РЕДАКТИРОВАТЬ 2: Я думаю, что я понял, почему моя проблема происходит: с ExtractFilePath (первая ссылка) в моем собственном A.dll я обнаружил, что setup.exe не выполняется внутри {tmp}, но один из двух других временных каталогов, которые являются создание в начале настройки. Также оказывается, что не {tmp}, а текущий рабочий каталог (то есть каталог, в котором выполняется inno) добавляется в путь поиска библиотеки (вторая ссылка). Это объясняет, почему другие библиотеки (B.dll, C.dll, ...) доступны только при ручном копировании в этот другой временный каталог. Я предполагаю, что A.dll извлекается и вызывается из {tmp} без проблем, потому что он упоминается как "main-library" во внешней команде. Я думал, что с помощью loadwithalteredsearchpath другие библиотеки могут оставаться в том же каталоге, но это, похоже, не работает.
Но как я могу исправить это сейчас изящно? Я думаю, что я мог бы скопировать библиотеки DLL вручную в путь установки (используя ExtractFilePath(ParamStr (0)), после того как они были извлечены в {tmp} для решения проблемы. Но это, кажется, грязный обходной путь, так как использование библиотек DLL в Inno Setup должна работать по-другому.
1 ответ
Ну, я не уверен, что вы загружаете только библиотеки DLL, не регистрируя их в системном реестре. Однако ваш первый EDIT показывает ошибку, вызванную попытками доступа к некоторому стеку реестра, так что я полагаю, что это так. В этом случае я просто использую командный файл (который запускает команды в консоли CMD), чтобы зарегистрировать мои DLL, как я бы по очереди:
@echo off
echo Registering DevExpress DLLs
%~dp0gacutil.exe /i %~dp0DevExpress.BonusSkins.v12.1.dll
%~dp0gacutil.exe /i %~dp0DevExpress.Charts.v12.1.Core.dll
Итак, я помещаю это в раздел RUN скрипта iss:
[Run]
Filename:C:\myFolder\RegisterDevExpress.bat"
Надеюсь это поможет.