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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 12:12:38