在 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
上执行数据删除。
是否有任何方法可以暂停 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
上执行数据删除。