在用户与消息框进行一些交互之前,是否有任何方法可以暂停执行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;
答案 0 :(得分:1)
当您执行Inno Setup卸载程序.exe时,它将自身克隆到一个临时文件夹并在内部运行克隆。主进程等待克隆(几乎)完成,然后终止自身。然后,克隆可以删除主卸载程序.exe(因为它不再处于锁定状态)。实际卸载完成后,主过程即终止。但在self.init
之前。因此,如果在此处显示消息框,则主卸载程序已终止,CurUninstallStepChanged(usPostUninstall)
中的Exec
也已终止。
如果可能,请在UnInstallOldVersion
而不是usUninstall
上删除数据。