我有一个任务来解决我们的产品安装程序的问题,最终陷入了死胡同,没有任何想法。
安装过程如下:
- 安装文件
- 在
[Run]
部分中配置一些服务 - 运行我们的定制产品配置器
- 如果步骤 3 成功(配置器返回良好的退出代码),则启动这些服务
- 否则回滚安装
所以问题是施罗德丁格的问题 - 在某些机器上,取消配置器中的安装后意外重新启动,没有任何问题。当然,这惹恼了用户。
我无法弄清楚机器决定重新启动的标准,但我偶然发现了这个东西:
在[Run]
部分中
Filename: "stub.exe"; Flags: runhidden skipifdoesntexist; BeforeInstall: ConfigureService
然后在[Code]
中,如果配置器返回错误的退出代码,ConfigureService
调用InstallationAbort
proc。
接下来,在InstallationAbort
:
Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT /noinstancecheck', '', SW_HIDE,
ewWaitUntilTerminated, ErrorCode);
所以作者在安装程序中呼吁卸载程序。 使用我确定的日志,安装程序不会在卸载程序完成工作后结束!它正在进入下一步(安装完成)!之后我可以在日志中看到
需要重新启动?是的
注意:如果未取消配置器,系统永远不会重新启动,即安装以正确的方式完成。
所以我尝试了:
- 将
/NORESTART
添加到卸载程序Exec
调用。无济于事。我认为这是因为是安装程序决定重新启动。 - 添加
WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
和其他一些调用以在调用卸载程序后退出安装程序。无济于事。 - 覆盖
NeedRestart
函数以在取消时返回 false
正如我试图理解的那样,作者调用卸载程序是因为需要删除已安装的服务(即使用特殊参数UninstallRun
调用它们)
所以,我的主要问题:从[Run]
部分调用的代码调用卸载程序以撤消[Run]
所做的更改是一种正常做法吗?
从
[Run]
部分中调用的代码调用卸载程序以撤消[Run]
中所做的更改是一种正常做法吗?
一般来说,这不是一种常见的做法。不应中止Run
部分中的安装。Inno Setup不是为了处理这个问题而设计的。
但是,如果需要,没有其他方法。您拥有的代码很可能基于此:
当运行命令失败时,如何强制 Inno 安装程序设置失败?
但这并不意味着安装程序应该需要重新启动。安装程序和卸载程序之间存在一些冲突。