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

时间:2017-05-11 11:38:06

标签: inno-setup

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

安装过程如下:

  1. 安装文件
  2. [Run]部分
  3. 中配置一些服务
  4. 运行我们的自定义产品配置程序
  5. 如果步骤3成功(配置程序返回了良好的退出代码),则启动这些服务
  6. 其他回滚安装
  7. 所以问题是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]中所做的更改是否正常?

1 个答案:

答案 0 :(得分:0)

  

通常是从[Run]部分调用的代码调用卸载程序来撤消[Run]中所做的更改吗?

一般来说,这不是一种常见做法。不应该在Run部分中止安装。 Inno Setup不是为处理它而设计的。

但如果你需要,那就别无他法了。您拥有的代码很可能基于此:
How to force Inno Setup setup to fail when Run command fails?

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