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;
额外说明
RegDeleteKeyIfExists函数需要Inno Setup 5.6及以上版本支持,如果使用旧版本,可替换为手动判断并删除注册表项的逻辑- 确保新的
DefaultDirName路径有效且有写入权限 - 测试时建议先手动卸载旧版本并清理注册表,再验证新版本的安装路径是否正确
内容的提问来源于stack exchange,提问作者Tumas04
相关产品推荐
相关产品推荐

