在Inno Setup安装程序中,卸载InstallShield LE进行的安装

时间:2017-10-30 13:49:34

标签: visual-studio-2017 inno-setup installshield setup-project

由于VS 2017不支持InstallShield LE,我试图改用Inno Setup。

但是,如何在安装开始之前使用Inno Setup脚本卸载InstallShield LE之前的安装 在不同的用户(不在同一台计算机上)安装了多个版本的应用程序。

由于产品代码在不同版本之间发生变化,因此use utf8注册表项中的GUID可能不同,因此很难在注册表的卸载部分找到它。

2 个答案:

答案 0 :(得分:2)

您可以使用Inno Setup: How to automatically uninstall previous installed version?

中的代码

虽然答案中的代码是用于卸载Inno Setup安装的先前版本,但它的通用性足以支持以前的任何卸载系统。

要使其与InstallShield一起使用,您需要知道要卸载的版本的产品代码。如果您需要能够删除任何版本,可以使用升级代码查找实际安装的版本的产品代码。为此,您可以使用WMI查询:
How to find the UpgradeCode and ProductCode of an installed application in Windows 7

在Inno Setup Pascal Script中,代码可以是:

NSPredicate(format: "%K = %@", $0.key, $0.value as! CVarArg)

虽然请注意查询可能需要几十秒。

答案 1 :(得分:1)

当我编写示例脚本和the related blog post时,很明显您应该查询注册表以检测以前安装的软件,

function InitializeSetup(): Boolean;
var
  oldVersion: String;
  uninstaller: String;
  ErrorCode: Integer;
begin
  if RegKeyExists(HKEY_LOCAL_MACHINE,
    'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F768F6BA-F164-4599-BC26-DCCFC2F76855}_is1') then
  begin
    RegQueryStringValue(HKEY_LOCAL_MACHINE,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F768F6BA-F164-4599-BC26-DCCFC2F76855}_is1',
      'DisplayVersion', oldVersion);
    if (CompareVersion(oldVersion, '6.0.0.1004') < 0) then
    begin
      if MsgBox('Version ' + oldVersion + ' of Code Beautifier Collection is already installed. Continue to use this old version?',
        mbConfirmation, MB_YESNO) = IDYES then
      begin
        Result := False;
      end
      else
      begin
          RegQueryStringValue(HKEY_LOCAL_MACHINE,
            'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F768F6BA-F164-4599-BC26-DCCFC2F76855}_is1',
            'UninstallString', uninstaller);
          ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
          Result := True;
      end;
    end
    else
    begin
      MsgBox('Version ' + oldVersion + ' of Code Beautifier Collection is already installed. This installer will exit.',
        mbInformation, MB_OK);
      Result := False;
    end;
  end
  else
  begin
    Result := True;
  end;
end;

您的基于InstallShield的安装程序还应该将基于GUID的子树插入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\,因此只需分析已存在的子树并采取必要的操作即可将其卸载。

A more recent blog post can be found here