RegistryValue类型为multiString的元素

时间:2018-04-15 18:04:17

标签: wix windows-installer

WiX doc表示如果type为 MultiString ,那么我们可以指定操作,追加,前置,写入(默认)。 什么是写行动的意思?它只是覆盖了之前的条目,还是用分号添加? 如果它只是覆盖了之前的条目,它与类型" 字符串"

的区别

1 个答案:

答案 0 :(得分:0)

我相信会覆盖字符串或多字符串的现有值,并强制指定任何新的字符串类型。 多字符串与字符串不同,因为你可以通过<MultiStringValue>元素添加一个stings列表(常规字符串值不能这样做 - 它不能有MultiStringValue子元素):

<RegistryValue Id="R3" Root="HKCU" Action="write" Key="Software\_WiXTest"
               Name="multi" Type="multiString" Value="samplemultistring">
    <MultiStringValue>test2.1</MultiStringValue>
    <MultiStringValue>test2.2</MultiStringValue>
</RegistryValue>

对于多字符串 prepend ,在字符串列表的开头添加字符串, append 将字符串添加到字符串列表的末尾。据我所知,多字符串不是以分号分隔的,而是以空字符串(\0)结尾的一系列以空字符结尾的字符串。见Registry Value Types

示例多字符串String1\0String2\0String3\0LastString\0\0,以及它在regedit.exe中的显示方式(带有对比的常规字符串):

View of a multi string in regedit.exe

只是倾倒一些样本测试标记 - 疣和所有:-) - 如果您愿意,可以用于测试:

<Component Feature="MainApplication" Id="HKCU" Guid="*">
  <RegistryValue Id="R1" Root="HKCU" Key="Software\_WiXTest" KeyPath="yes" 
                 Name="WiXWritten" Type="string" Value="R1 regular string">
  </RegistryValue>
  <RegistryValue Id="R2" Root="HKCU" Action="append" Key="Software\_WiXTest" 
                 Name="WiXWritten" Type="multiString" Value="R2 sample multistring">
      <MultiStringValue>test1.1</MultiStringValue>
      <MultiStringValue>test1.2</MultiStringValue>
      <MultiStringValue>test1.3</MultiStringValue>
  </RegistryValue>
  <RegistryValue Id="R3" Root="HKCU" Action="write" Key="Software\_WiXTest"
                 Name="WiXWritten" Type="multiString" Value="R3 sample multistring">
     <MultiStringValue>test2.1</MultiStringValue>
     <MultiStringValue>test2.2</MultiStringValue>
   </RegistryValue>
 </Component>

上面的一些元素会在安装时互相覆盖 - 据我所知,这是你不清楚的。也许将它转储到你的WiX源中并给它一个测试旋转。

通过重复多个RegistryValue元素,您可以获得与MultiStringValue元素相同的效果。

尝试将上一个RegistryValue元素的Action="write"更改为Action="append"。现在它添加到现有的多字符串而不是覆盖它。它应该成为:R2 sample multistring\0test1.1\0test1.2\0test1.3\0R3 sample multistring\0test2.1\0test2.2\0\0