2008-12-11 8 views
9

Alternatywnie można ręcznie zaktualizować wbudowany pasek postępu? Zasadniczo mam 2 MSIs włączone i przy użyciu Inno Setup jako bootstrapper, i w zależności od danych wejściowych użytkownika jeden lub oba z MSI mają być zainstalowane. Mam coś pracy przy użyciu instrukcji Exec w CurStepChanged, ale nie aktualizuje pasek postępu, gdy pliki są wyodrębniane i wygląda na to, że instalator jest zablokowany. Domyślam się, że końcowy wynik to, że chcę niektóre aktualizacje paska postępu, podczas gdy pliki są wyodrębniane do folderu tymczasowego. Poniżej zamieszczona jest mój bieżący kod:W konfiguracji Inno można dodawać instrukcje warunkowe do tego, co w sekcji [Uruchom] zostanie wykonane?

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; 

Odpowiedz

24

Dlaczego nie po prostu spróbować czegoś takiego:

[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 

Oczywiście nie koniecznie trzeba używać Components. Nie napisałeś, w jaki sposób zdecydujesz, który instalator ma zostać uruchomiony. Jeśli potrzebujesz bardziej złożonej logiki, możesz również użyć numeru Check functions:

[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; 
+0

Myślę, że czek: to jest to, co powinienem wiedzieć. Nie znalazłem nic o tym w pliku pomocy Inno Setup (co było zaskakująco pomocne) i nie było to możliwe w GUI ISTool. +1 teraz i zaakceptowany, jeśli działa :) – Davy8

+1

Połączyłem się z odpowiednią sekcją pliku pomocy w odpowiedzi (Zobacz "Sprawdź funkcje"). Jest tam. ISTool również to wspiera. Wystarczy spojrzeć na kartę "Często" dowolnego elementu w sekcji "Skrypty". Jeśli już pisałeś funkcje z wynikiem boolowskim, możesz je po prostu wybrać z rozwijanego menu. –

+0

Tak, zauważyłem, że po tym zacząłem to robić. Wygląda na to, że działa i jest tak bliski ideałowi, jak to zapewne dostanę bez spędzania wielu godzin na szukaniu i tworzeniu niestandardowego okna dialogowego postępu i innych rzeczy. Dzięki :) – Davy8

Powiązane problemy