我们的应用程序现在原生支持 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 位安装路径?
我认为您不能让 Inno Setup 自动为您执行此操作。
\n但您可以在初始化安装程序时将 32 位注册表项复制到 64 位,以允许 Inno Setup 找到它。当然,如果安装被取消,您必须回滚副本。
\n#define AppId "My Program"\n\n[Setup]\nAppId={#AppId}\nDefaultDirName={pf}\\My Program\nArchitecturesInstallIn64BitMode=x64\nRun 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;\nRun Code Online (Sandbox Code Playgroud)\n(需要Unicode 版本的 Inno Setup \xe2\x80\x93 Inno Setup 6 以来的唯一版本)
\n| 归档时间: |
|
| 查看次数: |
628 次 |
| 最近记录: |