在InnoSetup中卸载结束时运行应用程序,处理用户取消

时间:2010-03-29 18:05:40

标签: scripting inno-setup uninstall

在卸载期间,系统会询问用户“您确定要卸载......”。

然后用户将单击“是”或“否”。

是否有可能在脚本上捕获这个?

因为我需要在卸载过程结束时执行一个应用程序。

如果我在“InitializeUninstall()”期间执行该应用程序,那是不正确的,因为用户可以稍后取消卸载(上述对话框显示在此功能之后)。

与“DeInitializeUninstall()”相同,即使用户取消卸载,此功能仍会执行。

基本上,我需要在用户真正卸载(同意卸载)时执行应用程序。因为我需要捕获此应用程序的ExitCode以设置UninstallNeedRestart()函数。

感谢。

3 个答案:

答案 0 :(得分:1)

您可以在[代码]部分添加全局变量

 [Code]

var
  ApplicationWasUninstalled: Boolean;

之后,在InitializeUninstallProgressForm过程中,您可以将全局变量设置为1(注意:仅当用户在提示他们是否要卸载应用程序时单击“是”时才会执行此函数

procedure InitializeUninstallProgressForm();
begin
  ApplicationWasUninstalled := true;
end;

继续,您将检查DeinitializeUninstall函数中ApplicationWasUninstalled的值

procedure DeinitializeUninstall();
begin
  if ApplicationWasUninstalled Then Begin
      //your code here
  end;
end;

答案 1 :(得分:1)

实现此目的的另一种方法是使用[Run]和/或[UninstallRun]部分在安装后/卸载前运行可执行文件。

您可以运行可执行文件来执行您需要的任何清理工作。

编译一个帮助程序exe以执行您想要的操作,或者在提供命令行参数时将该函数添加到主可执行文件中。

[Run]
Filename: "{app}\CleanUp.exe"; WorkingDir: "{app}"

[UninstallRun]
Filename: "{app}\CleanUp.exe"; Parameters: "/uninstall"; WorkingDir: "{app}"; RunOnceId: "CleanUpApp"

inno设置文档中的更多信息:http://www.jrsoftware.org/ishelp/index.php?topic=runsection

您还需要将helper exe添加到安装中:

[Files]
...
Source: "C:\myprog\CleanUp.exe"; DestDir: "{app}"; Flags: ignoreversion

答案 2 :(得分:1)

使用usPostUninstall参数调用CurUninstallStepChanged()事件函数时,可以执行此操作。

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    if CurUninstallStep = usPostUninstall then
    begin
        // Do your uninstall time code here
        Exec(ExpandConstant('{app}\CleanUp.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
    end;
end;