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

Inno setup Inno安装:保留现有32位安装路径进行升级,使用64位路径进行新安装,inno-setup,Inno Setup,我们的应用程序现在本机支持64位,因此默认情况下应安装在C:\Program Files目录下。因此,我们制定了以下两项指令: ArchitecturesInstallIn64BitMode=x64 DefaultDirName={pf}\{#ProductName} 到目前为止,这项工作没有任何问题 问题是,我们的产品仍然只有32位,因此在C:\Program Files(x86)下面正确安装了很多现有安装 通常,Inno安装程序会检测到存在的安装,并使用相同的安装路径(如果找到)。但当从3

我们的应用程序现在本机支持64位,因此默认情况下应安装在
C:\Program Files
目录下。因此,我们制定了以下两项指令:

ArchitecturesInstallIn64BitMode=x64
DefaultDirName={pf}\{#ProductName}
到目前为止,这项工作没有任何问题

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

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


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

我认为您不能让Inno安装程序自动执行此操作

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

#定义AppId“我的程序”
[设置]
AppId={#AppId}
DefaultDirName={pf}\My程序
体系结构安装64位模式=x64
[代码]
常数
UninstallKey='SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppId}\u is1';
变量
回滚键:布尔值;
RootKey32:整数;
RootKey64:整数;
程序COPY32位卸载键到64位;
变量
I:整数;
值名称:TArrayOfString;
ValueName:字符串;
ValueStr:字符串;
价值观:红衣主教;
成功:布尔;
开始
如果存在注册表项(HKCU64,卸载注册表项)或
RegKeyExists(HKLM64,卸载密钥)然后
开始
日志('找到64位卸载密钥,保持原样');
结束
其他的
开始
如果存在注册表项(HKCU32,卸载注册表项),则
开始
日志(“找到32位HKCU卸载密钥,将其复制到64位密钥”);
RootKey32:=HKCU32;
RootKey64:=HKCU64;
结束
其他的
如果存在注册表项(HKLM32,卸载注册表项),则
开始
日志(“找到32位HKLM卸载密钥,将其复制到64位密钥”);
RootKey32:=HKLM32;
RootKey64:=HKLM64;
结束
其他的
开始
日志(“未找到32位卸载密钥”);
RootKey32:=0;
RootKey64:=0;
结束;
如果RootKey32为0,则
开始
如果不是RegGetValueNames(RootKey32、UninstallKey、ValueNames),则
开始
日志('无法列出32位卸载键值');
结束
其他的
开始
I:=0;
成功:=正确;
而(I

(需要–Inno Setup 6的唯一版本)

OK,现在是时候停止黑客攻击并将32位密钥复制到64位密钥,以使一切正常工作。查看我的更新答案。@Miral你是对的。我已经修改了我的答案(尽管我仍然在使用
HKCU
HKLM
,以使代码更具通用性-我