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

Inno Setup中不可卸载应用的更新安装程序路径识别问题

问题原因与解决方案

是的,Uninstallable=no正是导致更新程序无法获取之前安装目录的核心原因。

原因说明

Inno Setup中,UsePreviousAppDir=yes功能的实现依赖于主安装程序写入注册表的卸载信息——其中就包含用户选择的安装路径。当你设置Uninstallable=no时,安装程序会跳过所有与卸载相关的注册表写入操作,自然不会留存安装路径的记录,更新程序也就无法通过UsePreviousAppDir找到自定义的安装目录。

解决方案

你需要在不开启可卸载功能的前提下,手动留存安装路径记录,以下是两种可行方案:

方案1:自定义注册表存储安装路径

在主安装程序中添加注册表项,将用户选择的安装路径写入自定义位置,更新程序读取该位置获取路径。

主安装程序配置修改(添加[Registry]段):

[Setup]
AppId=MyApp
DefaultDirName={sd}\myapp
ChangesEnvironment=yes
PrivilegesRequired=admin
Uninstallable=no
ArchitecturesInstallIn64BitMode=x64
SignTool=signtool

[Registry]
Root: HKLM; Subkey: Software\MyApp; ValueType: string; ValueName: InstallPath; ValueData: {app}; Flags: createvalueifdoesntexist

更新程序配置修改(修改DefaultDirName):

[Setup]
AppId=MyApp
DefaultDirName={reg:HKLM\Software\MyApp,InstallPath|{sd}\myapp}
CloseApplications=no
DisableProgramGroupPage=yes
ChangesEnvironment=yes
PrivilegesRequired=admin
Uninstallable=no
ArchitecturesInstallIn64BitMode=x64

{reg:...|{sd}\myapp}表示优先读取注册表中的路径,若读取失败则使用默认路径。

方案2:隐藏卸载项但保留卸载信息

如果允许后台存在卸载记录(仅对用户隐藏),可以设置Uninstallable=yes并隐藏卸载条目,这样UsePreviousAppDir就能正常工作。

主安装程序配置修改:

[Setup]
AppId=MyApp
DefaultDirName={sd}\myapp
ChangesEnvironment=yes
PrivilegesRequired=admin
Uninstallable=yes
UninstallDisplayName=
ArchitecturesInstallIn64BitMode=x64
SignTool=signtool

UninstallDisplayName=会让卸载项不在控制面板的“程序和功能”中显示,同时注册表会留存安装路径信息,更新程序的UsePreviousAppDir=yes就能正常获取自定义安装目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:22:08