关于返回值:如果在执行之前取消旧版软件的卸载,如何终止安装程序?

how to terminate installer if unstallation of legacy version of software is cancelled before executing it?

我使用 innosetup 创建了一个安装程序 (myinstaller) 来安装应用程序 (myapp)。
代码片段是:

1
2
3
4
5
6
7
8
9
10
11
function legacy_check(): Boolean;
    begin
       ShellExec('runas', 'rundll32.exe', 'dfshim.dll,ShArpMaintain SecretsUtility.application, Culture=neutral, PublicKeyToken=0000000000000000, processorArchitecture=amd64', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
       Result := True;
    end;

function InitializeSetup(): Boolean;
    begin                                  
       Result:=legacy_check(); // after this line only inno setup wizard page will appear
       // code to install latest version
     end;

这里的 legacy_check() 函数检查系统中是否存在旧版本的 myapp 并将其卸载并返回 true 。以便 myinstaller 可以继续进行。

但是,这里在卸载旧版本时,会询问用户是否卸载。那个时候如果用户按 OK 卸载,它工作正常。但是如果用户按取消卸载旧版本,它应该终止 myinstaller。但它没有终止,因为它仍然返回 True。

所以我认为当用户按下取消按钮卸载时我需要获取一些返回码,以便使用返回码我可以返回真或假。

那么当用户按下取消卸载时,有什么方法可以获取返回码,以便我可以在行后使用它,

1
ShellExec('runas', 'rundll32.exe', 'dfshim.dll,ShArpMaintain SecretsUtility.application, Culture=neutral, PublicKeyToken=0000000000000000, processorArchitecture=amd64', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);  ?

否则请告诉我如何静默卸载它。我对如何在 ShellExec 中使用 /SILENT 参数感到困惑,因为已经存在参数。
所以请给我一些想法。


我改变了我的代码如下来达到要求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function legacy_check(): Boolean;
begin
   ShellExec('runas', 'rundll32.exe', 'dfshim.dll,ShArpMaintain SecretsUtility.application, Culture=neutral, PublicKeyToken=0000000000000000, processorArchitecture=amd64', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
   if RegKeyExists(HKEY_CURRENT_USER,'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\myapp') then
                  Result := False
               else
                  Result := True;
end;

function InitializeSetup(): Boolean;
begin                                  
   Result:=legacy_check();
    if Not Result then
    begin
       Result:=False
    else
      // code to install latest version
end;