1

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

4

1 回答 1

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>
于 2013-04-19T14:10:07.393 回答