Inno Setup запуск исполняемого файла (для установки драйверов) во время установки

я использую Inno Setup для создания установщика для моего приложения. Установщик очень простой и просто копирует некоторые файлы. Это работает очень хорошо, и я доволен этим.

недавно я реализовал поддержку USB и для этого необходимо установить USB-драйвер из ivi foundation. Это в основном EXE-файл, который должен быть запущен где-то в процессе установки. До сих пор пользователь должен устанавливать драйверы отдельно, что не так элегантно. Мой первый подход был это:

[Run]
Filename: "{app}driverIviSharedComponents_2.2.1.exe"; Description: "Install USB driver (IVI Foundation)"; Flags: postinstall skipifsilent
Filename: "{app}driverIviSharedComponents64_2.2.1.exe"; Description: "Install 64bit USB driver (IVI Foundation)"; Flags: postinstall skipifsilent
Filename: "{app}{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, "&", "&&")}}"; Flags: postinstall skipifsilent

это работает, но пользователь должен выбрать необходимую разрядность. Преимущество здесь в том, что он может не устанавливать его (в этом случае приложение просто игнорирует функциональность USB, которая в порядке). На самом деле я хочу автоматически определить битность системы и запустить процесс установки. Это не должно быть в [Run] раздел, хотя я ничего не имею против него (потому что пользователь может выбрать не устанавливать его).

I также нашел код и попытался запустить его следующим образом:

[Code]
procedure CurStepChanged (CurStep: TSetupStep);
var
   WorkingDir:   String;
   ReturnCode:   Integer;
begin    
   if (ssInstall = CurStep) then
     Log('Starting driver installation');
     WorkingDir := ExpandConstant ('{app}driver');
     Exec ('IviSharedComponents_2.2.1.exe', '', WorkingDir, SW_SHOW, ewWaitUntilTerminated, ReturnCode);
end;

но это не запускает установку (хотя я вижу запись журнала "запуск установки драйвера"). Что-то не так с моим путем? Что я делаю неправильно и как я могу изменить этот скрипт, чтобы автоматически выбрать правильный исполняемый файл в зависимости от разрядности?

EDIT: я использовал предлагаемое решение с [Tasks] запись. Реализация выглядит так (только для ссылка):

[Tasks]
Name: "install_usb"; Description: "Install USB drivers (IVI Foundation)"; GroupDescription: "External drivers:";

[Run]
Filename: "{app}driverIviSharedComponents_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: Not IsWin64(); Tasks: install_usb; Flags: skipifsilent
Filename: "{app}driverIviSharedComponents64_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: IsWin64(); Tasks: install_usb; Flags: skipifsilent

это работает очень хорошо, большое спасибо за вашу помощь!

1 ответов


в этом случае лучше всего удалить флаг postinstall, чтобы он запускался безоговорочно в конце процесса установки (но до того, как он будет завершен) и добавить Check: параметр, чтобы ограничить его правильной разрядностью:

[Run]
Filename: "{app}\driver\IviSharedComponents_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: Not IsWin64(); Flags: skipifsilent
Filename: "{app}\driver\IviSharedComponents64_2.2.1.exe"; StatusMsg: "Installing USB driver (IVI Foundation)"; Check: IsWin64(); Flags: skipifsilent

Если вы хотите, чтобы это было условным, вы можете использовать нормальный [Tasks] запись, которая запрашивает перед началом установки.