我在我的脚本中运行以下代码:
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
,但由于有很多二进制文件,我宁愿不使用这种方法。
答案 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