用于创建 32 位和 64 位安装程序的一个 .wxs 文件中的注册表项出现问题
Posted
技术标签:
【中文标题】用于创建 32 位和 64 位安装程序的一个 .wxs 文件中的注册表项出现问题【英文标题】:Issue with registry entry in one .wxs file to create both 32 bit and 64 bit installer 【发布时间】:2020-03-19 18:25:26 【问题描述】:这是我的脚本:
<DirectoryRef Id="TARGETDIR">
<!--for 64 bit platform-->
<?if $(sys.BUILDARCH)="x64"?>
<Component Id="RegistryEntries64" Guid="EFC1C5ED-0BC8-4B52-943A-BFF5F3136B4F" Win64="yes">
<RegistryKey Root="HKLM" Key="SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers">
<RegistryValue Type="string" Name="$(var.ProductNameForRegistyEntry)" Value="Installed" KeyPath="yes"/>
</RegistryKey>
<RegistryKey Root="HKLM" Key="SOFTWARE\ODBC\ODBCINST.INI\$(var.ProductNameForRegistyEntry)">
<-------/>
</RegistryKey>
<RemoveFolder Id="RegistryEntries64" On="uninstall"/>
</Component>
<?else?>
<!--for 32 bit platform-->
<Component Id="RegistryEntries86" Guid="E37BE3EF-1979-4C56-A768-2D6B6AB99870" Win64="no">
<RegistryKey Root="HKLM" Key="SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI\ODBC Drivers">
<RegistryValue Type="string" Name="$(var.ProductNameForRegistyEntry)" Value="Installed"/>
</RegistryKey>
<RegistryKey Root="HKLM" Key="SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI\$(var.ProductNameForRegistyEntry)">
<----->
</RegistryKey>
<RemoveFolder Id="RegistryEntries86" On="uninstall"/>
</Component>
<?endif?>
</DirectoryRef>
使用此脚本创建的 32 位安装程序(Visual Studio 2015 中的 x86 平台选择)在 64 位操作系统机器上运行良好,注册表项在 WOW6432Node 中创建,基本上这是安装在 64 位机器上的 32 位安装程序,所以该用户可以在 64 位机器上安装 64 位和 32 位安装程序,但在 32 位操作系统上,注册表项应位于 SOFTWARE\ODBC\ODBCINST.INI\ODBC 驱动程序中。在 32 位机器上,Get-OdbcDriver 命令不会返回列表中的驱动程序。 Wix 本身不建议使用平台变量 sys.BUILDARCH 获取目标平台类型。 我是否需要为 32 位操作系统机器编写单独的脚本,我将在其中提供注册表项 SOFTWARE\ODBC\ODBCINST.INI\ODBC 驱动程序?还是有其他解决方案? 我在互联网上查看了很多 *** 帖子和其他帖子,但我找不到与此相关的任何内容。 提前致谢
【问题讨论】:
【参考方案1】:您无需为此创建单独的脚本。一种可能的解决方案是您定义另一个变量(即 Installer_x86_x86),并根据其值为 64 位和 32 位操作系统创建 32 位安装程序。
<?if $(var.Installer_x86_x86)="no"?>
<RegistryKey Root="HKLM" Key="SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI\ODBC Drivers">
<RegistryValue Type="string" Name="$(var.ProductNameForRegistyEntry)" Value="Installed"/>
</RegistryKey>
<RegistryKey Root="HKLM" Key="SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI\$(var.ProductNameForRegistyEntry)">
<RegistryValue Type="string" Name="Description" Value="TIBCO ComputeDB ODBC Driver" />
</RegistryKey>
<?else?>
<RegistryKey Root="HKLM" Key="SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers">
<RegistryValue Type="string" Name="$(var.ProductNameForRegistyEntry)" Value="Installed"/>
</RegistryKey>
<RegistryKey Root="HKLM" Key="SOFTWARE\ODBC\ODBCINST.INI\$(var.ProductNameForRegistyEntry)">
<RegistryValue Type="string" Name="Description" Value="TIBCO ComputeDB ODBC Driver" />
</RegistryKey>
<?endif?>
如果您创建一个 .wxi 文件并将所有变量放入其中并将其包含在您的 .wxs 文件中会更好,这样您在创建安装程序之前就可以轻松更改变量值
【讨论】:
以上是关于用于创建 32 位和 64 位安装程序的一个 .wxs 文件中的注册表项出现问题的主要内容,如果未能解决你的问题,请参考以下文章