Inno设置 - 多次执行AfterInstall操作

时间:2016-05-05 08:00:38

标签: inno-setup

我在我的脚本中运行以下代码:

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 个答案:

答案 0 :(得分:3)

为什么使用func check2(f *Foo) error { if n(f.Bar) { return errors.New("Missing 'bar'") } if n(f.Qux) { return errors.New("Missing 'qux'") } if n(f.Baz) { x := int64(42) f.Baz = &x } return nil } 参数?防火墙规则如何与DLL文件相关?

改为使用CurStepChanged(ssPostInstall)

AfterInstall

但是,如果由于某种原因确实需要使用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