2011-06-14 865 views
17

在安装过程中,我运行了一个bat文件。如果bat文件返回错误,我需要中止/终止安装。我想为它做一个MsgBox告诉用户发生了什么事情,然后为了中止,看起来像用户按下了取消按钮。Inno Setup:如何在安装过程中中止/终止安装?

是否可以终止/终止安装?

代码示例将非常感谢。

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

另请参阅[如何在运行命令失败时强制Inno Setup安装程序失败?](http://stackoverflow.com/q/1122588/850848)和[使用Process Exit代码显示特定文件的错误消息\ [Run \]](http://stackoverflow.com/q/9621099/850848) – 2017-05-11 13:12:45

+0

另请参阅[退出Inno安装安装从\ [code \]](https://stackoverflow.com/q/4438506/ 850848#39788977)。 – 2017-07-12 12:15:32

回答

10

问题是[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; 
+0

谢谢。这正是我正在寻找的。 – PM2 2011-06-14 18:56:00

+1

“WizardForm.Close”显示一个“是/否”对话框,询问用户他是否要取消,我还有其他强制执行取消的代码吗? – 2013-10-01 11:05:35

25

谢谢罗伯特。任何时候当脚本检测到无法继续安装时,都会发生常见问题。 但是,您的解决方案存在问题。 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; 
+0

我一直在寻找,所以感谢您的评论! – BenDev 2017-01-06 08:33:59

1

我用从这里解答一些代码组成complete solution在与错误适当的通知和回滚[运行]部分安全运行的命令。

2

只是为了圆了其他可能性:

如果你能收集来自用户的任何信息,然后做检查是在InitializeSetup功能的最佳场所之前检查先决条件。这允许您显示MsgBox,然后用Result := False退出以中止安装。

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

如果您正在查看的条件与特定页面(如目标目录)上的用户选择有关,并且您可以快速执行检查并且根本不更改用户系统,那么这是最好的在NextButtonClick处理;您可以显示带有错误的MsgBox,然后返回False以防止转到下一页。

如果您必须等到安装其他所有东西后,退出安装还为时过晚,但如果您仍然想这样做,那么Robert的答案就足够了。