Problem: neben dem normalen Installer, sollen weitere Komponenten mit installiert werden. Dies sind andere Installationspakete. Im Beispiel ein MSI-Paket (Microsoft Installer) und ein normales Setup. Beide sollen möglichst Silent installiert werden.
Zuerst nehmen wir die beiden Installer ins InnoSetup mit auf:
;Third Party installer
Source: "msi_installer.msi"; DestDir: {tmp}; AfterInstall: RunOtherInstaller;
Source: "schneuse_installer.exe"; DestDir: {tmp}; AfterInstall: RunOtherInstaller2;
Die beiden Installer werden so mit ins Installationspaket aufgenommen. Beim Installieren der Anwendung werden diese dann in ein temporäres Verzeichnis extrahiert. Nach Abschluss der Installation werden diese wieder gelöscht, so dass kein Speicherplatz verschwendet wird.
Nun müssen wir die Installer noch aufrufen. Dies passiert, wie man oben bereits sehen kann, nach der Hauptinstallation in der Methode RunOtherInstaller
.
[Code]
procedure RunOtherInstaller;
var
ResultCode: Integer;
begin
ShellExec('', 'msiexec.exe', ExpandConstant('/I "{tmp}\msi_installer.msi" /qb+')
, '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
end;
procedure RunOtherInstaller2;
var
ResultCode: Integer;
begin
ShellExec('', ExpandConstant('{app}\schneuse_installer.exe'), '/S'), '',
SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
end;
Beide Installer werden nacheinander aufgerufen. Es wird jeweils gewartet, dass diese beendet werden, bevor der nächste startet. Es wird ShellExec
verwendet. Der normale Aufruf mit Exec
hat nicht richtig funktioniert. Hier wurden die Parameter nicht erkannt. Mit ShellExec
geht es.
Im Beispiel gibt es keine Fehlerbehandlung. Diese könnte man zusätzlich noch über den Parameter ResultCode
realisieren.