2013-10-25 14 views
20

To [Files] część mojego kodu do tej pory:Inno Setup: Zainstaluj inny instalator i uruchomić go przed kontynuowaniem mój zainstalować

[Files] 
Source: "other_installer.exe"; DestDir: "{app}" 
Source: "myprogram.exe"; DestDir: "{app}" 
Source: "data.dat"; DestDir: "{app}" 
Source: "otherdata.dat"; DestDir: "{app}" 

Mój program jest zależny od innego programu do uruchomienia. Doinstalowałem instalator dla tego programu ("other_installer.exe") w moim instalatorze. Chciałbym uruchomić ten instalator zaraz po skopiowaniu, zanim przejdę do "myprogram.exe", a resztę.

Mam googleed i znalazłem dokumentację dla BeforeInstall w pomocy Inno Setup, ale nie mają one przykładu uruchomienia innej aplikacji. Wierzę, że powinno to być coś takiego:

[Files] 
Source: "other_installer.exe"; DestDir: "{app}" 
Source: "myprogram.exe"; DestDir: "{app}"; BeforeInstall: // RUN OTHER_INSTALLER.EXE // 
Source: "data.dat"; DestDir: "{app}" 
Source: "otherdata.dat"; DestDir: "{app}" 

Odpowiedz

24

Lepiej za sposób idziesz może być parametr AfterInstall. Poniższy skrypt wykona funkcję RunOtherInstaller zaraz po przetworzeniu wpisu pliku OtherInstaller.exe. Tam próbuje uruchomić właśnie zainstalowany plik OtherInstaller.exe, a jeśli to się nie powiedzie, wyświetli komunikat o błędzie dla użytkownika. Należy pamiętać, że nie można przerwać instalację z tej funkcji, więc nie jest to dużo bezpieczne, co chcesz w ten sposób:

[Setup] 
AppName=My Program 
AppVersion=1.5 
DefaultDirName={pf}\My Program 

[Files] 
Source: "OtherInstaller.exe"; DestDir: "{app}"; AfterInstall: RunOtherInstaller 
Source: "OtherFile.dll"; DestDir: "{app}" 

[Code] 
procedure RunOtherInstaller; 
var 
    ResultCode: Integer; 
begin 
    if not Exec(ExpandConstant('{app}\OtherInstaller.exe'), '', '', SW_SHOWNORMAL, 
    ewWaitUntilTerminated, ResultCode) 
    then 
    MsgBox('Other installer failed to run!' + #13#10 + 
     SysErrorMessage(ResultCode), mbError, MB_OK); 
end; 
+0

Czy będzie możliwe zapisanie błędu i przerwanie (i potencjalnie wycofanie) instalacji później? – Septagram

0

Można użyć AfterInstall, spojrzeć na to w Pomocy. Gdy plik zostanie właśnie skopiowany, uruchomię funkcję/procedurę, którą ustawisz jako "AfterInstall:".

W tej funkcji/procedurze użyj Exec i uruchom drugi instalator.

+0

Tak, przepraszam, jeśli moja odpowiedź jest podobna do twojej –

8

Innym dobrym czasem na uruchomienie instalatorów wymagań wstępnych jest funkcja zdarzenia PrepareToInstall. (Zobacz przykładowe skrypty dostarczone z Inno dla podstawowej struktury i kod TLAMY dla rzeczywistego wykonania.)

Główną zaletą PrepareToInstall jest to, że pozwala na obsługę błędów i ponowne uruchamianie żądań od instalatora podrzędnego - przy użyciu AfterInstall nie robi.

Główną wadą jest to, że trzeba ręcznie ExtractTemporaryFile wszystko, co jest wymagane do uruchomienia instalacji podrzędnej, ponieważ ma to miejsce przed wyodrębnieniem plików.

Powiązane problemy