我创建了一个RegistryKey和一个嵌套在这个RegistryKey中的RegistryValue。后来我创建了另一个RegistryValue - 没有嵌套在WiX的XML方案中的任何RegistryKey中。但我希望第二个RegistryValue在安装完成后实际上位于第一个RegistryKey内。所以我想从许多RegistryValue引用一个RegistryKey。怎么做?
它还要求各种注册表值都在各种组件中,因此我无法将所有注册表值放在WiX方案中的单个注册表项中。
示例如下所示。
<Component>
<RegistryValue
Root="HKLM"
Name="ShortcutInstalled"
Key="SetupAndAccessoryData1"
Type="integer"
Value="1"
KeyPath="yes"
/>
</Component>
<Component>
<RegistryKey
Id="SetupAndAccessoryData1"
Action="createAndRemoveOnUninstall"
Key="SOFTWARE\$(var.Manufacturer)\$(var.ProductName)\SetupAndAccessoryData"
Root="HKLM"
>
<RegistryValue
Type="string"
Name="InstallDirectory"
Value="[ProductDirectory]"
KeyPath="yes"
>
</RegistryValue>
</RegistryKey>
</Component>
现在,我必须使用与RegistryKey的Key属性相同的数据填充ShortcutInstalled RegistryValue的Key属性。但由于重构困难,我不想复制和粘贴它。我只想引用相同的注册表项。获得它的最佳方法是什么?
答案 0 :(得分:3)
当您在单个键下嵌套许多RegistryKey
个元素时,RegistryValue
元素主要是为了方便而提供的。但是,没有必要使用RegistryKey
元素,因为RegistryValue
也可以提供完整路径。您上面的例子也可以写成:
<Component>
<RegistryValue
Root="HKLM"
Key="SOFTWARE\$(var.Manufacturer)\$(var.ProductName)\SetupAndAccessoryData"
Name="ShortcutInstalled"
Value="1"
Type="integer" />
</Component>
<Component>
<RegistryValue
Id="SetupAndAccessoryData1"
Root="HKLM"
Key="SOFTWARE\$(var.Manufacturer)\$(var.ProductName)\SetupAndAccessoryData"
Name="InstallDirectory"
Value="[ProductDirectory]"
Type="string" />
</RegistryValue>
</Component>
这主要是一个偏好问题。或者,如果您需要在许多Components
中引用相同的注册表项,则可以使用预处理器变量来存储路径的公共部分,然后在许多RegistryValue
元素中使用它。例如,我们可以将上面的内容修改为:
<?define CommonReg = "SOFTWARE\$(var.Manufacturer)\$(var.ProductName)\SetupAndAccessoryData" ?>
<Component>
<RegistryValue
Root="HKLM"
Key="$(var.CommonReg)"
Name="ShortcutInstalled"
Value="1"
Type="integer" />
</Component>
<Component>
<RegistryValue
Id="SetupAndAccessoryData1"
Root="HKLM"
Key="$(var.CommonReg)"
Name="InstallDirectory"
Value="[ProductDirectory]"
Type="string" />
</RegistryValue>
</Component>