WiX:如何在卸载时防止删除注册表值?

18

我想要在安装后断言某个注册表值存在,所以我添加了以下组件:

<Component Id="RegistryEntryContextMenuOdt" Guid="4BA5BA24-4F65-4BDF-99EB-CB4B947F31A9" DiskId="1" KeyPath="yes">
    <RegistryKey Id="RegKeyOdt" Root="HKCR" Action="create" Key=".odt">
      <RegistryValue Type="string" Value="openDocument.WriterDocument.1" />
    </RegistryKey>
</Component>
键/值可能在安装前已经设置好了。但我希望该值被设置为我的特定值,也就是说,它将被覆盖为我的值。
我的问题现在是,当我的产品被卸载时,这个值总是被删除。然而,如果它是由我的安装程序添加的,我只希望删除该值。如果我的安装程序只是修改了该值,则应恢复先前的值(或者,如果不可能恢复,则我的值应保持不变)。
请注意,键本身在卸载时不会被移除。这似乎是正常工作的,因为我在RegistryKey元素上指定了Action="create"。
是否有类似于RegistryValue的设置,可以创建值但不在安装时删除它?
更新:HKCR下的两个注册表键都是全局设置,即它们来自注册表的HKLM\SOFTWARE\Classes分支。
1个回答

28
您可以通过使用Component元素NeverOverwrite属性来确保组件仅在注册表条目不存在时安装。从Wix文档中了解NeverOverwrite的详细信息:

如果将此属性设置为“yes”,则 安装程序不会安装或重新安装该组件,如果该组件的关键路径文件或关键路径注册表条目已经存在。

您还可能需要在Registry元素上设置KeyPath属性为yes,以明确注册表条目是组件关键路径。
如果您确实希望设置注册表值,即使它已经存在,但是您不想在卸载时删除它,则可以改用Component元素的Permanent属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接