Inno Setup:在设置过程中调用卸载程序 - 这是回滚的正确方法吗?



我有一个任务来解决我们的产品安装程序的问题,最终陷入了死胡同,没有任何想法。

安装过程如下:

  1. 安装文件
  2. [Run]部分中配置一些服务
  3. 运行我们的定制产品配置器
  4. 如果步骤 3 成功(配置器返回良好的退出代码),则启动这些服务
  5. 否则回滚安装

所以问题是施罗德丁格的问题 - 在某些机器上,取消配置器中的安装后意外重新启动,没有任何问题。当然,这惹恼了用户。

我无法弄清楚机器决定重新启动的标准,但我偶然发现了这个东西:

[Run]部分中

Filename: "stub.exe"; Flags: runhidden skipifdoesntexist; BeforeInstall: ConfigureService

然后在[Code]中,如果配置器返回错误的退出代码,ConfigureService调用InstallationAbortproc。

接下来,在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 安装程序设置失败?

但这并不意味着安装程序应该需要重新启动。安装程序和卸载程序之间存在一些冲突。

最新更新