用于创建 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 文件中的注册表项出现问题的主要内容,如果未能解决你的问题,请参考以下文章

32位和Java中的64位JDBC同时

32 位和 64 位之间的指针增量差异

关于 64 位和 32 位 JVM

Studio创建64位和32位项目有啥区别

是否可以在 Windows 7 上同时安装 32 位和 64 位 Java?

如何在我的应用程序中包含 64 位和 32 位本机代码