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

时间:2011-06-14 15:17:35

标签: installer inno-setup

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

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

我们非常感谢代码示例。

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

4 个答案:

答案 0 :(得分:30)

谢谢你,罗伯特。当脚本检测到无法继续安装时,这是一个常见问题。 但是,您的解决方案存在问题。 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;

答案 1 :(得分:12)

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

所以你有几个选择。

使用活动:procedure CurStepChanged(CurStep: TSetupStep);

使用{tmp}\test.batExec调用ExecAsOriginalUser这两个返回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;

答案 2 :(得分:2)

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

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

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

如果您要检查的条件与特定页面上的用户选择(例如目标目录)有关,您可以快速进行检查,而无需更改用户的系​​统。所有,那么最好在NextButtonClick中处理;您可以显示包含错误的MsgBox,然后返回False以防止转到下一页。

如果你必须等到安装其他所有东西之后,那么退出安装还为时已晚,但如果你想这样做,那么罗伯特的答案就足够了。

答案 3 :(得分:1)

我已经使用了这里的答案中的一些代码来撰写complete solution以在[Run]部分中安全地运行命令,并在出错时正确通知和回滚。