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

时间:2009-04-02 13:17:47

标签: wix registry uninstall

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

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

在安装之前可能已经设置了键/值。但是,我希望将值设置为我的特定值,即它将被我的值覆盖。

现在我的问题是,在卸载我的产品时,此值始终已删除。但是,如果我的安装程序添加了值,我只希望删除该值。如果我的安装程序刚修改了该值,则应恢复之前的值(或者,如果不可能,则我的值应保持不变)。

请注意,卸载时不会删除密钥本身。这似乎工作正常,因为我在Action="create"元素上指定了RegistryKey

RegistryValue是否有类似的设置可以创建值但不会在安装时将其删除?

更新:HKCR下的两个注册表项都是机器范围的设置,即它们来自注册表的HKLM \ SOFTWARE \ Classes分支。

1 个答案:

答案 0 :(得分:25)

通过使用Component elementNeverOverwrite属性,您可以确保仅在注册表项不存在时才安装组件。来自NeverOverwrite的wix文档:

  

如果此属性设置为“是”,则   安装程序无法安装或   如果是关键路径,请重新安装组件   文件或密钥路径注册表项   该组件已存在。

您可能还需要将Registry元素上的KeyPath属性设置为yes,以明确注册表项是组件键路径。

如果您确实想要设置注册表值,即使它已经存在,但您不想在卸载时删除它,那么您可以使用Component元素的Permanent属性。