基于Inno-Setup实现应用重命名安装及旧版本自动卸载
Inno-Setup实现应用重命名时自动卸载旧版本并安装新版
核心思路
在新应用安装流程启动前,通过注册表查询和已知路径检查双方式定位所有旧版本(OldAppName、NewAppName)的卸载程序,静默执行卸载操作,待卸载完成后再继续新应用的安装。仅针对64位系统处理。
具体实现代码
在Inno-Setup脚本的[Code]段中添加以下逻辑:
function InitializeSetup(): Boolean; var UninstallKey: String; UninstallPath: String; ResultCode: Integer; I: Integer; SubKeyNames: TArrayOfString; begin Result := True; // 1. 遍历64位注册表查找已安装的目标版本 if RegGetSubkeyNames(HKLM64, 'Software\Microsoft\Windows\CurrentVersion\Uninstall', SubKeyNames) then begin for I := 0 to GetArrayLength(SubKeyNames) - 1 do begin UninstallKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' + SubKeyNames[I]; // 匹配目标应用名称 if RegQueryStringValue(HKLM64, UninstallKey, 'DisplayName', UninstallPath) then begin if (UninstallPath = 'OldAppName') or (UninstallPath = 'NewAppName') then begin // 获取卸载程序路径并移除多余引号 if RegQueryStringValue(HKLM64, UninstallKey, 'UninstallString', UninstallPath) then begin UninstallPath := RemoveQuotes(UninstallPath); // 静默执行卸载并等待完成 if Exec(UninstallPath, '/verysilent /norestart', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then begin Log('成功卸载: ' + UninstallPath); end else begin Log('卸载失败: ' + UninstallPath + ',错误码: ' + IntToStr(ResultCode)); end; end; end; end; end; end; // 2. 补充检查已知路径下的卸载程序(应对注册表未记录的情况) // 检查OldAppName卸载程序 UninstallPath := 'C:\Program Files\MyCompany\OldAppName\unins000.exe'; if FileExists(UninstallPath) then begin if Exec(UninstallPath, '/verysilent /norestart', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then begin Log('从已知路径成功卸载OldAppName'); end; end; // 检查NewAppName旧版本卸载程序 UninstallPath := 'C:\Program Files\MyCompany\NewAppName\unins000.exe'; if FileExists(UninstallPath) then begin if Exec(UninstallPath, '/verysilent /norestart', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then begin Log('从已知路径成功卸载NewAppName旧版本'); end; end; end;
代码说明
- 注册表查询:优先通过64位系统的卸载项注册表路径查找,覆盖绝大多数标准安装的版本。
- 已知路径兜底:作为注册表查询的补充,处理旧版本未正确写入注册表的边缘场景。
- 静默卸载参数:
/verysilent /norestart实现无交互卸载,避免打断安装流程;若需要保留重启提示,可替换为/silent。 - 等待机制:通过
ewWaitUntilTerminated确保卸载完成后再进入新应用安装环节,避免路径冲突。
脚本基础配置
确保脚本仅针对64位系统编译:
[Setup] ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64
内容的提问来源于stack exchange,提问作者Richard Gale
相关产品推荐
相关产品推荐

