В Inno Setup можно ли добавить условные операторы к тому, что в разделе [Run] выполняется?

В качестве альтернативы можно вручную обновить встроенный индикатор выполнения? В основном у меня есть 2 MSI и я использую Inno Setup в качестве загрузчика, и, в зависимости от ввода пользователя, один или оба MSI должны быть установлены. У меня есть кое-что, работающее с использованием операторов Exec в CurStepChanged, но он не обновляет индикатор выполнения, когда файлы извлекаются, и похоже, что установщик остановился. Я предполагаю, что в результате я хочу обновить индикатор выполнения, пока файлы извлекаются во временную папку. Ниже мой текущий код:

procedure CurStepChanged(CurStep: TSetupStep);
var
    ResultCode: Integer;
begin
    if(CurStep = ssInstall) then begin
        if(InstallServer) then begin
            ExtractTemporaryFile('ServerSetup.msi');
            Exec('msiexec',ExpandConstant('/i "{tmp}\ServerSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Server\" ALLUSERS=2'),'', SW_SHOW, ewWaitUntilTerminated, ResultCode);
        end;
        if(InstallClient) then begin
            ExtractTemporaryFile('ClientSetup.msi');
            Exec('msiexec',ExpandConstant('/i "{tmp}\ClientSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Client\" ALLUSERS=2'),'', SW_SHOW, ewWaitUntilTerminated, ResultCode);
        end;
    end;
end;
11.12.2008 16:47:58
1 ОТВЕТ
РЕШЕНИЕ

Почему бы просто не попробовать что-то вроде этого:

[Files]
Source: ClientSetup.msi; DestDir: {tmp}; Flags: deleteafterinstall; Components: Client
Source: ServerSetup.msi; DestDir: {tmp}; Flags: deleteafterinstall; Components: Server

[Run]
Filename: msiexec.exe; Parameters: /i "{tmp}\ClientSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Client\" ALLUSERS=2; WorkingDir: {tmp}; StatusMsg: Installing client; Components: Client
Filename: msiexec.exe; Parameters: /i "{tmp}\ServerSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Server\" ALLUSERS=2; WorkingDir: {tmp}; StatusMsg: Installing server; Components: Server

[Components]
Name: Client; Description: Client Installation
Name: Server; Description: Server Installation

Конечно, вам не обязательно использовать Components. Вы не написали, как вы решаете, какой установщик запустить. Если вам нужна более сложная логика, вы также можете использовать Checkфункции, как в:

[Files]
Source: ClientSetup.msi; DestDir: {tmp}; Flags: deleteafterinstall; Check: CheckClient
Source: ServerSetup.msi; DestDir: {tmp}; Flags: deleteafterinstall; Check: CheckServer

[Run]
Filename: msiexec.exe; Parameters: /i "{tmp}\ClientSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Client\" ALLUSERS=2; WorkingDir: {tmp}; StatusMsg: Installing client; Check: CheckClient
Filename: msiexec.exe; Parameters: /i "{tmp}\ServerSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Server\" ALLUSERS=2; WorkingDir: {tmp}; StatusMsg: Installing server; Check: CheckServer

[Code]
function CheckClient: Boolean;
begin
  Result := WhateverCondition;
end;

function CheckServer: Boolean;
begin
  Result := WhateverOtherCondition;
end;
24
11.12.2008 18:10:01
Я думаю, что Чек: это то, что мне нужно было знать. Я ничего не видел об этом в файле справки Inno Setup (который на удивление был довольно полезен), и это не было опцией в интерфейсе ISTool. +1 сейчас и принято, если это работает :)
Davy8 11.12.2008 18:20:31
Я связался с соответствующим разделом справочного файла в ответе (см. «Проверка функций»). Это там. ISTool также поддерживает это. Просто посмотрите на вкладку «Общие» любого элемента в разделе «Сценарии». Если вы уже написали функции с логическим результатом, вы можете просто выбрать их из выпадающего списка.
Oliver Giesen 11.12.2008 18:30:49
Да, я заметил это после того, как начал это делать. Похоже, что это работает и настолько близко к идеалу, насколько я, вероятно, получу, не тратя часы / дни на изучение и создание собственного диалога прогресса и прочего. Спасибо :)
Davy8 11.12.2008 19:00:47