multiString 类型的 RegistryValue 元素

RegistryValue Element of type multiString

WiX doc 说如果类型是 MultiString 那么我们可以指定操作、附加、前置、写入(默认)。 这里写动作是什么意思?它只是简单地覆盖之前的条目,还是添加分号? 如果它只是覆盖之前的条目,它与类型“string

有何不同

我相信 write 会覆盖现有值(无论是字符串还是多字符串),并强制指定任何新的字符串类型。 Multi string 与 string 不同,因为您可以通过 <MultiStringValue> 元素添加字符串列表(常规字符串值不能这样做 - 它不能有 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 将字符串添加到字符串的末尾列表。据我所知,Multi strings 不是以分号分隔的,而是一系列以 null 结尾的字符串,以空字符串 ([=13=]) 结尾。见 Registry Value Types:

多字符串示例String1[=14=]String2[=14=]String3[=14=]LastString[=14=][=14=],以及它在 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[=21=]test1.1[=21=]test1.2[=21=]test1.3[=21=]R3 sample multistring[=21=]test2.1[=21=]test2.2[=21=][=21=].