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

Inno Setup:安装新版本前自动卸载旧版的路径问题

解决Inno Setup升级时忽略新DefaultDirName的问题

问题原因

当新旧版本AppId一致时,Inno Setup会自动从注册表读取旧版本的安装路径作为{app}的默认值,即使你指定了新的DefaultDirName;再加上你设置了DisableDirPage=yes,用户无法手动修改路径。同时你当前在ssInstall步骤卸载旧版本,此时{app}已经被旧路径赋值,卸载后依然会沿用这个路径安装新版本。

解决方案

  • 将旧版本卸载操作提前到ssPrepare步骤(安装准备阶段,此时{app}尚未被确定)
  • 卸载完成后手动重置{app}为新的DefaultDirName,确保安装路径正确
  • 清除旧版本残留的注册表路径项,避免程序再次读取旧路径

修改后的核心代码

{ ///////////////////////////////////////////////////////////////////// }
procedure CurStepChanged(CurStep: TSetupStep);
var
  NewInstallDir: String;
begin
  if (CurStep = ssPrepare) then
  begin
    if IsUpgrade() then
    begin
      // 卸载旧版本
      UnInstallOldVersion();
      
      // 重置{app}为新的默认安装路径
      NewInstallDir := ExpandConstant('C:\Projects\{#MyAppName}');
      {app} := NewInstallDir;
      
      // 清除旧版本的卸载注册表项,彻底消除旧路径影响
      RegDeleteKeyIfExists(HKLM, ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'));
      RegDeleteKeyIfExists(HKCU, ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'));
    end;
  end;
end;

额外说明

  1. RegDeleteKeyIfExists函数需要Inno Setup 5.6及以上版本支持,如果使用旧版本,可替换为手动判断并删除注册表项的逻辑
  2. 确保新的DefaultDirName路径有效且有写入权限
  3. 测试时建议先手动卸载旧版本并清理注册表,再验证新版本的安装路径是否正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:56:04