2016-05-05 10 views
2

Ich habe das folgende Stück Code in meinem Skript auszuführen:Inno Setup - Afterinstall Aktion ausgeführt mehrfach

procedure AddRulesToFirewall(); 
var 
    ResultCode: Integer; 
begin 
    Exec('netsh.exe','advfirewall firewall add rule name="MyApplication" dir=in program="{app}\MyApplication.exe" security=notrequired action=allow protocol=tcp','',SW_SHOW, ewWaitUntilTerminated, ResultCode); 
end; 

Und ich habe folgende AfterInstall Aktion:

Source:{#OutputBinaries}\Company*.dll; DestDir: {app}; Components: binaries; AfterInstall: AddRulesToFirewall() 

jedoch die AfterInstall Aktion wird oft ausgeführt, daher gehe ich davon aus, dass die Aktion AfterInstall für jede unter diesem Befehl gruppierte Binärdatei ausgeführt wird.

Meine Frage ist, wie soll ich das ändern, so dass der Code AddRulesToFirewall nur einmal ausgeführt wird, nachdem die Binärdateien installiert sind?

Ich realisiere, dass ich alle Binärdateien einzeln in den Dateien Abschnitt auflisten konnte und die AfterInstall nur auf der letzten Binärdatei haben, aber da es viele Binärdateien gibt, würde ich diesen Ansatz lieber nicht verwenden.

+1

Die Funktion wird nach jeder Company * .dll-Datei aufgerufen - Sie rufen Wildcard auf. In diesem Fall ist es besser, Single File Einträge mit dem 'AfterInstall'-Flag hinzuzufügen und am besten 'CurStepChanged' mit' ssPostInstall' zu verwenden, wie Martin vorgeschlagen hat. – RobeN

Antwort

3

Warum verwenden Sie den Parameter AfterInstall? Wie verhält sich die Firewall-Regel zu den DLL-Dateien?

Verwenden Sie die CurStepChanged(ssPostInstall) statt:

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    if CurStep = ssPostInstall then 
    begin 
    AddRulesToFirewall; 
    end; 
end; 

Obwohl, wenn Sie wirklich die AfterInstall aus irgendeinem Grund verwenden müssen, können Sie CurrentFileName magische Variable verwenden, wenn Sie die letzte Datei Anpassung der Wildcard kennen .

procedure AddRulesToFirewall(); 
var 
    ResultCode: Integer; 
begin 
    if ExtractFileName(CurrentFileName) = 'CompanyLast.dll' then 
    begin 
    Exec(
     'netsh.exe', 
     'advfirewall firewall add rule name="MyApplication" dir=in ' + 
     'program="{app}\MyApplication.exe" security=notrequired action=allow protocol=tcp', 
     '', SW_SHOW, ewWaitUntilTerminated, ResultCode); 
    end; 
end; 

Obwohl dies unzuverlässig sein kann.


Eine weitere Option ist, wenn der Platzhalter-Eintrag nicht der letzte ist, der BeforeInstall Parameter des nächsten Eintrags zu verwenden.

Source: Company*.dll; DestDir: {app} 
Source: AnotherFile.dat; DestDir: {app}; BeforeInstall: AddRulesToFirewall() 
Verwandte Themen