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

Posted

技术标签:

【中文标题】WiX:如何防止注册表值在卸载时被删除?【英文标题】:WiX: How to prevent a registry value from being removed on uninstall? 【发布时间】:2010-10-17 02:47:59 【问题描述】:

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

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

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

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

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

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

【讨论】:

以上是关于WiX:如何防止注册表值在卸载时被删除?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 wix 在卸载时编写注册表项

如何在卸载 MSI 时删除单个注册表值?

使用程序卸载键中的 EstimatedSize 值在“添加/删除程序”列表中正确显示程序大小

如何防止 wix 自定义引导程序卸载 UI 在升级过程中显示

如何使用 EntityFramework 4.1 CodeFirst 防止十进制值在保存时被截断为 2 位? [复制]

RemoveRegistryKey 不删除注册表项