2016-05-05 6 views
2

を実行し、私は私のスクリプトで実行する次のコードを持っている:Inno Setupの - AfterInstallアクションが複数回

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; 

そして、私は次のようAfterInstallアクションがあります。

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

しかしAfterInstallアクションを何度も実行されるため、このコマンドでグループ化されたバイナリごとに、AfterInstallアクションが実行されていると仮定しています。

私の質問は、AddRulesToFirewallのコードをバイナリのインストール後に一度しか実行しないようにするにはどうすればよいですか?

ファイルセクションにすべてのバイナリをリストし、最後のバイナリにはAfterInstallしか持たないことに気付きましたが、バイナリがたくさんあるので、私はむしろこのアプローチを使いません。

+1

この機能は、各Company * .dllファイルをaferと呼びます。ワイルドカードを呼び出します。そのような場合は、 'AfterInstall'フラグをつけた単一ファイルエントリを追加するほうが良いでしょう。そして、マーチンが示唆したように、' CurStepChanged'と 'ssPostInstall'を使うのがベストです。 – RobeN

答えて

3

なぜAfterInstallパラメータを使用しますか?ファイアウォールルールはどのようにDLLファイルに関連していますか?

代わりCurStepChanged(ssPostInstall)を使用してください:

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

けれども、あなたが実際にいくつかの理由でAfterInstallを使用する必要がある場合は、ワイルドカードに一致する最後のファイルを知っていれば、あなたは、CurrentFileName魔法変数を使用することができます。

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; 

これは信頼できないかもしれませんが。ワイルドカードエントリは次のエントリのBeforeInstallパラメータを使用して、最後の1でない場合


別のオプションは、です。

Source: Company*.dll; DestDir: {app} 
Source: AnotherFile.dat; DestDir: {app}; BeforeInstall: AddRulesToFirewall() 
関連する問題