0

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>

それでもうまくいきません。

あなたの助けは大歓迎です!

4

2 に答える 2

1

hkcu が hklm と同じように仮想化されているとは思えません。コンポーネントが 32 ビットとしてマークされていることを確認する必要があり、仮想化はすべて処理されます。

于 2013-05-12T06:49:05.797 に答える
0

このキーは、カスタム アクションを使用して作成できます。Dot NET Framework 4.0 には、32 ビット アプリケーションから 64 ビット レジストリを読み取る特別な機能 ( RegistryView ) があります。詳細については、このドキュメントを参照してください。アンインストールでこのキーを削除するには、別のカスタム アクションを記述する必要があります。

カスタム アクション:

[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;
    }

WiX:

<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>
于 2013-05-13T07:12:41.377 に答える