Inno Setup:如何在安装过程中中止/终止设置?

Posted

技术标签:

【中文标题】Inno Setup:如何在安装过程中中止/终止设置?【英文标题】:Inno Setup: How to abort/terminate setup during install? 【发布时间】:2011-09-14 19:30:00 【问题描述】:

在安装过程中,我运行了一个 bat 文件。如果 bat 文件返回错误,我需要中止/终止设置。我想让它做一个MsgBox 告诉用户发生了什么,然后让 abort 看起来和行为就像用户按下了 Cancel 按钮。

是否可以中止/终止设置?

非常感谢代码示例。

[Run]
Filename: tmp\test.bat; WorkingDir: tmp; Flags: waituntilterminated runhidden

【问题讨论】:

另见How to force Inno Setup setup to fail when Run command fails?和Using Process Exit code to show error message for a specific File in [Run] 另见Exit from Inno Setup Installation from [code]。 【参考方案1】:

问题是安装过程成功完成后出现[Run]。 所以此时不​​能取消,只能卸载。 另外[Run] 不允许您获取退出代码。

所以你有几个选择。

使用事件:procedure CurStepChanged(CurStep: TSetupStep);

并且使用ExecExecAsOriginalUser 调用tmp\test.bat 都会返回ResultCode。然后您可以提示用户卸载。

但是我认为执行取消会更容易。

为此,请在项目的最后一个文件上创建一个AfterInstall 事件。 并从此事件中执行程序,因为您可以从此事件中取消。

这里是一些示例代码,展示了它是如何完成的。

[Files]
Source: "MYPROG.EXE"; DestDir: "app"; AfterInstall: MyAfterInstall

[Code]
procedure MyAfterInstall();
var
 ResCode : Integer;
begin
 if Exec(ExpandConstant('tmp') + '\test.bat',
         '', SW_HIDE, ewWaitUntilTerminated, ResCode) then
 begin
    Program Ran successfully ResCode now contains exit code results 

    if Exit was 10 then Cancel Installation. 
   if ResCode = 10 then
   begin
      WizardForm.Close;
   end;       
 end
 else
 begin
    Problem running Program 
   MsgBox('Error', SysErrorMessage(ResCode), mbError, MB_OK);
 end;

end;

【讨论】:

谢谢。这正是我想要的。 “WizardForm.Close”显示“是/否”对话框询问用户是否要取消,是否还有其他代码强制执行取消? WizardForm.Close 仅​​适用于非静默设置。见***.com/a/56020597/321013【参考方案2】:

谢谢你,罗伯特。当脚本检测到无法继续安装时,这是一个常见问题。 但是,您的解决方案存在问题。 WizardForm.Close 调用取消对话框,只有当用户回答“是”时安装才会停止。要确定退出,我们应该调用CancelButtonClick

[Files]
Source: "MYPROG.EXE"; DestDir: "app"; AfterInstall: MyAfterInstall

[Code]
var CancelWithoutPrompt: boolean;

function InitializeSetup(): Boolean;
begin
  CancelWithoutPrompt := false;
  result := true;
end;

procedure MyAfterInstall();
begin
   Do something 
  if BadResult then begin
    MsgBox('Should cancel because...',mbError,MB_OK)
    CancelWithoutPrompt := true;
    WizardForm.Close;
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID=wpInstalling then
    Confirm := not CancelWithoutPrompt;
end;

【讨论】:

我不知道为什么 2021 仍然没有标志来指定 run 必须成功。【参考方案3】:

我已使用此处答案中的一些代码来编写complete solution,以便在 [Run] 部分安全地运行命令,并提供适当的通知和错误回滚。

【讨论】:

【参考方案4】:

只是为了完善其他可能性:

如果您可以在从用户那里收集任何信息之前检查先决条件,那么进行检查的最佳位置是在 InitializeSetup 函数中。这允许您显示MsgBox,然后以Result := False 退出以中止安装。

如果您需要先从用户那里收集一些信息(例如安装目录),但仍然可以在不安装任何文件的情况下检查情况(除了可能通过ExtractTemporaryFile 安装的一些文件),那么最好的地方是PrepareToInstall 函数。这允许您显示错误消息(通过返回它),此时用户可以返回并更正某些内容或自行退出安装。

如果您要检查的条件与特定页面上的用户选择特别相关(同样,例如目标目录),并且您可以快速进行检查并且根本不改变用户的系统,那么最好在NextButtonClick 中处理它;您可以显示带有错误的MsgBox,然后返回False 以防止进入下一页。

如果你必须等到安装完其他所有东西,那么退出安装有点太晚了,但如果你想这样做,那么罗伯特的回答就足够了。

【讨论】:

以上是关于Inno Setup:如何在安装过程中中止/终止设置?的主要内容,如果未能解决你的问题,请参考以下文章

inno setup相关

如何使用 inno setup 结束进程?

在安装过程中使用 Inno Setup 删除另一个未随 Inno Setup 安装的应用程序

我在用inno setup打包的程序,在安装过程中会先解压,当解压完成后滚动条就满了

Inno Setup执行SQL脚本的方法

inno setup打包的安装文件更换位置后图标改变了