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
相关产品推荐
相关产品推荐

