我有一个超级简单的安装程序来测试安装程序是否可以在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>
它仍然不起作用。
非常感谢您的帮助!
答案 0 :(得分:1)
我认为hkcu的虚拟化方式与hklm不同。您需要确保将组件标记为32位,并且将为您处理任何虚拟化。
答案 1 :(得分:0)
您可以使用自定义操作创建此密钥。 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>