【问题标题】:Wix: Write register entries under HKCU\Software\Classes\Wow6432NodeWix:在 HKCU\Software\Classes\Wow6432Node 下写入寄存器条目
【发布时间】:2013-05-13 15:12:41
【问题描述】:

我有一个超级简单的安装程序来测试安装程序是否可以在 HKCU\Software\Classes\Wow6432Node 下写入寄存器条目(msi 是目标 x86,我正在 Win7 x64 机器上测试它)。

问题是:它根本不想在 Wow6432Node 下写任何东西。以下是代码:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="f671ee4d-dd0a-4f7f-a4d1-1d181d2f3002" Name="TestWow" Language="1033" Version="1.0.0.0" Manufacturer="X" UpgradeCode="5d030587-0b6f-4a55-b090-c97a4fd22d13">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perUser" InstallPrivileges="limited"/>

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate />

    <Feature Id="ProductFeature" Title="XWix" Level="1">
      <ComponentRef Id="TestWow" />
    </Feature>
  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir" />
  </Fragment>

  <Fragment>
    <DirectoryRef Id="TARGETDIR">
      <Component Id="TestWow" Guid="f671ee4d-dd0a-4f7f-a4d1-1d181d2f3002">
        **<RegistryKey Root="HKCU" Key="Software\Classes\TestWow">
          <RegistryValue Name="Test" Value="Wow" Type="string" KeyPath="yes"/>
        </RegistryKey>**
      </Component>
    </DirectoryRef>
  </Fragment>
</Wix>

我什至尝试过修改注册表部分,例如:

<RegistryKey Root="HKCU" Key="Software\Classes\Wow6432Node\TestWow">
  <RegistryValue Name="Test" Value="Wow" Type="string" KeyPath="yes"/>
</RegistryKey>

还是不行。

非常感谢您的帮助!

【问题讨论】:

    标签: wix wix3.7


    【解决方案1】:

    我认为 hkcu 的虚拟化方式与 hklm 不同。您需要确保您的组件被标记为 32 位组件,并且将为您处理任何虚拟化。

    【讨论】:

      【解决方案2】:

      您可以使用自定义操作创建此密钥。 Dot NET Framework 4.0 有一个特殊功能 (RegistryView) 可以从 32 位应用程序中读取 64 位注册表。有关详细信息,请参阅 this 文档。您需要编写另一个自定义操作以在卸载时删除此键。

      自定义操作:

      [CustomAction]
          public static ActionResult CustomAction1(Session session)
          {
              RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
              key = key.OpenSubKey(@"Software\Classes\Wow6432Node", true);
              key.CreateSubKey("TestWow").SetValue("Test", "Wow", RegistryValueKind.String);
      
              return ActionResult.Success;
          }
      

      维克斯:

      <Binary Id="TestWow" SourceFile="CustomAction\TestProject\TestProject\bin\Release\TestProject.CA.dll" />
      <CustomAction Id="TESTWOW" BinaryKey="TestWow" DllEntry="CustomAction1" Return="check" />
      
      <Custom Action="TESTWOW" After="InstallInitialize" >Not Installed</Custom>
      

      【讨论】:

      • 我测试了这种方法,它对我有用。这种方法有什么问题吗?如果是这样,请告诉我,我会纠正自己。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多