繁体   English   中英

Inno Setup:在安装过程中调用卸载程序 - 这是一种正确的回滚方式吗?

[英]Inno Setup: Calling uninstaller while in setup - is that a proper way to rollback?

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

安装过程如下:

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

所以这个问题是Shroedinger的问题 - 在某些机器上,在配置器中取消安装后出现意外重启,没有任何问题。 当然那令人恼火的用户。

我无法弄清楚机器决定重启的标准,但我偶然发现了这件事:

[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不是为处理它而设计的。

但如果你需要,别无他法。 您拥有的代码很可能基于此:
当Run命令失败时,如何强制Inno Setup设置失败?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM