使用Inno Setup以64位覆盖32位安装时无法检测旧安装
问题解答
1. 双安装、双卸载项的情况是否符合预期?
是符合Inno Setup默认行为的。核心原因在于:
- 32位安装程序会把卸载信息写入
HKLM\SOFTWARE\WOW6432Node下的对应路径 - 开启64位模式后的安装程序,会直接将卸载信息写入
HKLM\SOFTWARE根目录
即便两者使用相同的AppId,Inno Setup默认会将它们识别为两个独立的安装实例,因此新的64位安装程序无法检测到旧的32位安装,最终导致双份安装和双卸载项。
2. 为什么没有安装到Program Files (x86)目录?
你设置了ArchitecturesInstallIn64BitMode=x64compatible arm64,这个参数会让64位模式的安装程序优先使用原生64位程序目录(即Program Files)。同时你用{autopf}作为DefaultDirName,这个常量在64位安装模式下会自动指向Program Files,而非Program Files (x86),所以新安装会放到Program Files目录下,和你之前的预期不符。
3. 如何实现32位到64位的平滑升级?
如果希望64位安装程序能识别并升级原32位安装,可以通过自定义代码实现:
- 在
[Code]段添加逻辑,手动检查旧的32位卸载注册表项(HKLM\SOFTWARE\WOW6432Node\...\Uninstall\{my-app-id}) - 若检测到旧安装存在,可引导用户卸载旧版本,或直接将新版本安装到原路径(需注意文件覆盖和兼容性)
示例代码片段:
function InitializeSetup(): Boolean; var OldUninstallPath: String; ResultCode: Integer; begin Result := True; // 检查32位卸载项是否存在 if RegQueryStringValue(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{my-app-id}', 'UninstallString', OldUninstallPath) then begin if MsgBox('检测到旧版本安装,请先卸载后再继续。是否立即卸载?', mbConfirmation, MB_YESNO) = IDYES then begin // 静默执行卸载命令 ShellExec('', OldUninstallPath, '/silent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); // 卸载后重启安装程序 Restart; end else begin // 用户取消卸载,终止安装流程 Result := False; end; end; end;
内容的提问来源于stack exchange,提问作者Petter Hesselberg
相关产品推荐
相关产品推荐

