You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:45:15