Inno Setup:更新后保留桌面图标位置及避免卸载删除图标
解决Inno Setup更新后桌面图标位置重置问题
要实现更新时保留桌面图标位置,核心是让旧版本卸载程序仅在升级场景下跳过删除桌面图标,同时不影响正常卸载时的图标清理。以下是具体实现方案:
方案一:通过卸载参数控制图标删除
1. 新版本安装时传递卸载参数
在安装脚本的[Code]段中,检测旧版本并执行卸载时添加自定义参数(例如/KeepDesktopIcon):
function InitializeSetup(): Boolean; var OldUninstallPath: String; ResultCode: Integer; begin Result := True; // 读取旧版本的卸载路径(替换{#MyAppId}为你的应用ID) if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1', 'UninstallString', OldUninstallPath) then begin // 执行旧卸载程序并传递保留图标参数 if Exec(OldUninstallPath, '/KeepDesktopIcon', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin // 卸载成功后继续安装流程 end else begin MsgBox('旧版本卸载失败:' + SysErrorMessage(ResultCode), mbError, MB_OK); Result := False; end; end; end;
2. 卸载时检测参数并跳过图标删除
在脚本的[UninstallCode]段中,添加逻辑判断命令行参数,若存在则跳过桌面图标删除:
// 辅助函数:检查命令行参数是否存在 function CmdLineParamExists(const Param: String): Boolean; var I: Integer; begin Result := False; for I := 1 to ParamCount do begin if CompareText(ParamStr(I), Param) = 0 then begin Result := True; Break; end; end; end; function UninstallInitialize(): Boolean; var DesktopIconPath: String; begin Result := True; // 检查是否传递了保留图标参数 if CmdLineParamExists('/KeepDesktopIcon') then begin // 获取桌面图标路径(与[Icons]段配置一致) DesktopIconPath := ExpandConstant('{autodesktop}\{#APPNAME_Messages}.lnk'); // 跳过删除桌面图标,保留原有位置 SetUninstallerOption(uoDeleteFiles, False); // 若需保留其他卸载清理逻辑,可单独处理非图标文件的删除 end; end;
方案二:简化版图标标记(仅适合特定场景)
如果不需要区分正常卸载和升级卸载,仅希望更新时保留图标,可直接修改[Icons]段添加uninsneveruninstall标志:
[Icons] Name: "{autodesktop}\{#APPNAME_Messages}"; Filename: "{app}\{#Programm}"; Tasks: desktopicon; Flags: uninsneveruninstall
⚠️ 注意:此方法会导致正常卸载(非升级)时图标也不会被删除,仅适合允许残留图标的场景。
关键说明
- 确保新旧版本的应用ID(
{#MyAppId})一致,才能正确检测到旧版本并执行带参数的卸载。 - 方案一能区分升级和正常卸载场景,是更合理的通用解决方案。
内容的提问来源于stack exchange,提问作者Jens
相关产品推荐
相关产品推荐

