如何创建单个RegistryKey并从许多RegistryValue中引用它?

时间:2013-04-19 13:20:03

标签: wix

我创建了一个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属性。但由于重构困难,我不想复制和粘贴它。我只想引用相同的注册表项。获得它的最佳方法是什么?

1 个答案:

答案 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>