由于VS 2017不支持InstallShield LE,我试图改用Inno Setup。
但是,如何在安装开始之前使用Inno Setup脚本卸载InstallShield LE之前的安装 在不同的用户(不在同一台计算机上)安装了多个版本的应用程序。
由于产品代码在不同版本之间发生变化,因此use utf8
注册表项中的GUID可能不同,因此很难在注册表的卸载部分找到它。
答案 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\
,因此只需分析已存在的子树并采取必要的操作即可将其卸载。