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

从InstallAware/MSI迁移至Inno Setup:版本识别与更新替换问题

将InstallAware迁移到Inno Setup:复用产品代码实现版本替换

InstallAware的Product Code本质是Windows Installer(MSI)体系下的ProductCode GUID,而Inno Setup默认用自有机制记录安装信息,只设置AppId为该GUID不足以让系统识别为同一应用——因为两者的安装信息存储路径和逻辑完全不同。以下是实现版本替换的具体步骤:

1. 基础配置:复用Product Code作为AppId

先把Inno Setup的AppId设置为你原InstallAware项目的Product Code GUID,确保全局唯一标识一致:

AppId={{你的InstallAware Product Code GUID}}

2. 自动检测并卸载旧MSI版本

Inno Setup不会自动识别MSI安装的旧程序,需要手动添加代码调用Windows Installer API完成卸载。在脚本的[Code]段加入以下逻辑:

function InitializeSetup(): Boolean;
var
  OldProductCode: string;
  UninstallExitCode: Integer;
begin
  OldProductCode := '{{你的InstallAware Product Code GUID}}';
  // 检查系统中是否存在旧版MSI安装记录
  if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + OldProductCode) then
  begin
    // 静默卸载旧版本(/qn参数为无交互模式)
    if Exec('msiexec.exe', '/x ' + OldProductCode + ' /qn', '', SW_HIDE, ewWaitUntilTerminated, UninstallExitCode) then
    begin
      Result := True;
    end
    else
    begin
      MsgBox('旧版本卸载失败,请手动卸载后再尝试安装。', mbError, MB_OK);
      Result := False;
    end;
  end
  else
  begin
    // 无旧版本,直接继续安装
    Result := True;
  end;
end;

3. 同步应用列表显示信息

确保Inno Setup的AppName、AppPublisher、UninstallDisplayName和原InstallAware安装程序的完全一致,避免Windows应用列表中出现重复条目:

AppName=你的应用名称
AppPublisher=你的发布者名称
UninstallDisplayName={#AppName} {#AppVersion}

4. Revision Code的对应处理

InstallAware的Revision Code对应MSI版本号中的修订部分,在Inno Setup中直接将AppVersion设置为旧版本的完整版本号(包含修订号)即可。后续推送更新时,只需递增AppVersion,Inno Setup会自动识别为新版本并覆盖安装。

为什么单独设置AppId无效?

MSI安装的程序会在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ProductCode}下记录信息,而Inno Setup默认在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{AppId}_is1(32位系统)或对应64位路径存储信息,系统会判定为两个独立应用。只有配合旧版本检测卸载+信息同步,才能实现无缝替换。

内容的提问来源于stack exchange,提问作者Barry Andrews

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:15:11