从InstallAware/MSI迁移至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

