在usPostUninstall中等待卸载程序提示,然后再在Inno Setup中进行安装

时间:2019-12-18 13:00:43

标签: installer inno-setup uninstall pascalscript

在用户与消息框进行一些交互之前,是否有任何方法可以暂停执行Inno Setup。我正在使用一个消息框来确认是否保留用户数据。我想停止安装程序中的所有其他执行,直到用户选择是或否。

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then
  begin
    if DirExists(ExpandConstant('{localappdata}\{#MyBuildId}\storage'))  then
      if MsgBox('Do you want to delete the saved user data?',
        mbConfirmation, MB_YESNO) = IDYES
      then
        DelTree(ExpandConstant('{localappdata}\{#MyBuildId}\storage'), True, True, True);
  end;
end;

我正在使用单独的过程在安装开始时卸载以前的版本。

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep=ssInstall) then
  begin
    if (IsUpgrade()) then
    begin
      UnInstallOldVersion();
    end;
  end;
end;

因此,在开始安装新安装程序时,它将先卸载旧版本。还显示用户数据删除消息框。但是执行并不会暂停。消息框显示时,它将卸载并重新安装该应用程序

function GetUninstallString(): String;
var
  sUnInstPath: String;
  sUnInstallString: String;
begin
  sUnInstPath :=
    ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1');
  sUnInstallString := '';
  if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then
    RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString);
  Result := sUnInstallString;
end;

function UnInstallOldVersion(): Integer;
var
  sUnInstallString: String;
  iResultCode: Integer;
begin
{ Return Values: }
{ 1 - uninstall string is empty }
{ 2 - error executing the UnInstallString }
{ 3 - successfully executed the UnInstallString }

  // default return value
  Result := 0;

  { get the uninstall string of the old app }
  sUnInstallString := GetUninstallString();
  if sUnInstallString <> '' then begin
    sUnInstallString := RemoveQuotes(sUnInstallString);
    if Exec(sUnInstallString, '/SILENT /NORESTART','', SW_HIDE,
            ewWaitUntilTerminated, iResultCode) then
      Result := 3
    else
      Result := 2;
  end else
    Result := 1;
end;

1 个答案:

答案 0 :(得分:1)

当您执行Inno Setup卸载程序.exe时,它将自身克隆到一个临时文件夹并在内部运行克隆。主进程等待克隆(几乎)完成,然后终止自身。然后,克隆可以删除主卸载程序.exe(因为它不再处于锁定状态)。实际卸载完成后,主过程即终止。但在self.init之前。因此,如果在此处显示消息框,则主卸载程序已终止,CurUninstallStepChanged(usPostUninstall)中的Exec也已终止。

如果可能,请在UnInstallOldVersion而不是usUninstall上删除数据。