Inno Setup:保留现有的 32 位安装路径进行升级,使用 64 位路径进行新安装

ab-*_*ols 5 inno-setup

我们的应用程序现在原生支持 64 位,因此默认情况下应安装在该C:\Program Files目录下。因此我们设置了这两个指令:

ArchitecturesInstallIn64BitMode=x64
DefaultDirName={pf}\{#ProductName}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这没有任何问题!

问题是我们的产品确实有很多现有安装,当时它仍然只是 32 位,因此在下面正确安装C:\Program Files (x86)

通常,Inno Setup 会检测现有安装并使用相同的安装路径(如果找到)。但从 32 位模式更改为 64 位模式时,这似乎不起作用 - 可能是因为现在使用了不同的卸载注册表项。

如果已经安装了应用程序(以执行更新),是否还有一种方法可以告诉 Inno Setup 使用现有的 32 位安装路径,并且如果是新安装则仅使用 64 位安装路径?

Mar*_*ryl 5

我认为您不能让 Inno Setup 自动为您执行此操作。

\n

但您可以在初始化安装程序时将 32 位注册表项复制到 64 位,以允许 Inno Setup 找到它。当然,如果安装被取消,您必须回滚副本。

\n
#define AppId "My Program"\n\n[Setup]\nAppId={#AppId}\nDefaultDirName={pf}\\My Program\nArchitecturesInstallIn64BitMode=x64\n
Run Code Online (Sandbox Code Playgroud)\n
[Code]\n\nconst\n  UninstallKey =\n    \'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{#AppId}_is1\';\n\nvar\n  Rollback64Key: Boolean;\n  RootKey32: Integer;\n  RootKey64: Integer;\n\nprocedure Copy32BitUninstallKeyTo64bit;\nvar\n  I: Integer;\n  ValueNames: TArrayOfString;\n  ValueName: string;\n  ValueStr: string;\n  ValueDWord: Cardinal;\n  Success: Boolean;\nbegin\n  if RegKeyExists(HKCU64, UninstallKey) or\n     RegKeyExists(HKLM64, UninstallKey) then\n  begin\n    Log(\'64-bit uninstall key found, leaving as it is\');\n  end\n    else\n  begin\n    if RegKeyExists(HKCU32, UninstallKey) then\n    begin\n      Log(\'32-bit HKCU uninstall key found, will copy it to the 64-bit key\');\n      RootKey32 := HKCU32;\n      RootKey64 := HKCU64;\n    end\n      else\n    if RegKeyExists(HKLM32, UninstallKey) then\n    begin\n      Log(\'32-bit HKLM uninstall key found, will copy it to the 64-bit key\');\n      RootKey32 := HKLM32;\n      RootKey64 := HKLM64;\n    end\n      else\n    begin\n      Log(\'No 32-bit uninstall key found\');\n      RootKey32 := 0;\n      RootKey64 := 0;\n    end;\n    \n    if RootKey32 <> 0 then\n    begin\n      if not RegGetValueNames(RootKey32, UninstallKey, ValueNames) then\n      begin\n        Log(\'Cannot list 32-bit uninstall key values\');\n      end\n        else\n      begin\n        I := 0;\n        Success := True;\n        while (I < GetArrayLength(ValueNames)) and Success do\n        begin\n          ValueName := ValueNames[I];\n          if RegQueryStringValue(\n               RootKey32, UninstallKey, ValueName, ValueStr) then\n          begin\n            if not RegWriteStringValue(\n                     RootKey64, UninstallKey, ValueName, ValueStr) then\n            begin\n              Log(Format(\'Error copying "%s" string value\', [ValueName]));\n              Success := False;\n            end\n              else\n            begin\n              Log(Format(\'Copied "%s" string value\', [ValueName]));\n            end;\n          end\n            else\n          if RegQueryDWordValue(\n               RootKey32, UninstallKey, ValueName, ValueDWord) then\n          begin\n            if not RegWriteDWordValue(\n                     RootKey64, UninstallKey, ValueName, ValueDWord) then\n            begin\n              Log(Format(\'Error copying "%s" dword value\', [ValueName]));\n              Success := False;\n            end\n              else\n            begin\n              Log(Format(\'Copied "%s" dword value\', [ValueName]));\n            end;\n          end\n            else\n          begin\n            // All uninstall values written by Inno Setup are\n            // either string or dword\n            Log(Format(\'Value "%s" is neither string nor dword\', [ValueName]));\n            Success := False;\n          end;\n\n          I := I + 1;\n        end;\n\n        if Success then\n        begin\n          Log(\'Copied 32-bit uninstall key to 64-bit\');\n          Rollback64Key := True;\n        end\n          else\n        begin\n          if not RegDeleteKeyIncludingSubkeys(RootKey64, UninstallKey) then\n          begin\n            Log(\'Failed to copy 32-bit uninstall key to 64-bit, \' +\n                \'and also failed to rollback the changes\');\n          end\n            else\n          begin\n            Log(\'Failed to copy 32-bit uninstall key to 64-bit, \' +\n                \'rolled back the changes\');\n          end;\n        end;\n      end;\n    end;\n  end;\nend;\n\nfunction InitializeSetup(): Boolean;\nbegin\n  if IsWin64 then\n  begin\n    Copy32BitUninstallKeyTo64bit;\n  end;\n\n  Result := True;\nend;\n\nprocedure CurStepChanged(CurStep: TSetupStep);\nbegin\n  if CurStep = ssPostInstall then\n  begin\n    if Rollback64Key then\n    begin\n      Log(\'Installation finished, removing obsolete 32-bit key\');\n      Rollback64Key := False;\n\n      if not RegDeleteKeyIncludingSubkeys(RootKey32, UninstallKey) then\n      begin\n        Log(\'Failed to remove obsolete 32-bit uninstall key\');\n      end\n        else\n      begin\n        Log(\'Removed obsolete 32-bit uninstall key\');\n      end;\n    end;\n  end;\nend;\n\nprocedure DeinitializeSetup();\nbegin\n  if Rollback64Key then\n  begin\n    Log(\'Installation cancelled, rolling back cloned 64-bit uninstall key\');\n\n    if not RegDeleteKeyIncludingSubkeys(RootKey64, UninstallKey) then\n    begin\n      Log(\'Failed to roll back cloned 64-bit uninstall key\');\n    end\n      else\n    begin\n      Log(\'Rolled back cloned 64-bit uninstall key\');\n    end;\n  end;\nend;\n
Run Code Online (Sandbox Code Playgroud)\n

(需要Unicode 版本的 Inno Setup \xe2\x80\x93 Inno Setup 6 以来的唯一版本)

\n