2011-06-08 95 views
1

我想在我的AfterInstall函数失败时在IS中执行回滚。这是我的代码示例。撤销或回滚安装

[Files] 
    Source: "MyWinService.exe"; DestDir: "{app}"; Flags: ignoreversion; AfterInstall:  MyAfterInstall 
    Source: "MyApp.exe"; DestDir: "{app}"; Flags: ignoreversion 
[Code] 
    const 
    WM_CLOSE = $0010; 
    procedure MyAfterInstall(); 
    var 
    exitCode: Integer; 
    begin 
     MsgBox (ExpandConstant('{cm:ErrServiceInstall}'), mbError, MB_OK); 
     SendMessage(WizardForm.Handle, WM_CLOSE, 0, 0); 
    end; 

在这个示例中,我只是直接想要取消安装,以便测试安装回滚。这里发生的是MsgBox显示后,由于SendMessage的缘故,显示ExitSetupMsgBox。当我在ExitSetupMsgBox中单击是时,将执行回滚。我想要的是ExitSetupMsgBox不显示,因为我已经显示了MsgBox。所以当我单击确定MsgBox回滚将被执行。

可以这样做吗?

回答

1

您可以使用事件CancelButtonClick您可以在其中打开确认对话框。

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean); 
begin 
    Cancel := True; 
    Confirm := False; 
end; 

您可以通过关闭WizardForm来触发取消方法,无需发送特殊消息即可调用。 WizardForm.Close这是我知道的在AfterInstall事件期间取消安装的唯一方法。

注意:如果你有

[setup] 
AllowCancelDuringInstall=no 

或运行带/ NOCANCEL命令行选项您的设置这将无法正常工作。

+0

这很好..但我怎么能不通过点击取消按钮对话框来调用这个事件呢? – patlimosnero 2011-06-08 08:03:49

+0

@patlimosnero - 更新答案,详细说明如何避免发送消息。 – 2011-06-08 09:44:48