在 Inno Setup 中继续安装之前等待 usPostUninstall 中的卸载程序提示

Waiting for uninstaller prompt in usPostUninstall before proceeding with installation in Inno Setup

是否有任何方法可以暂停 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;

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

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