安装时删除的注册表项不会在卸载时被替换

Registry entry that was removed on install not being replaced on uninstall

我有一个带有 RemoveRegistryValue 元素的 Wix 脚本。它在我安装产品时正确地删除了注册表值(假设我 运行 具有提升的权限,我现在就是)。但是,当我卸载产品时,注册表值没有被替换。 如果我想删除该值并且再也看不到我可以直接进入 regedit 并将其删除。将删除放在 Windows 安装程序包中的整个想法是,我可以卸载该包并将所有内容放回我需要的位置。然而这并没有发生。

<RemoveRegistryValue Id='ShowLnk' Root ='HKLM' 
       Key='SOFTWARE\Classes\Lnkfile' Name ='NeverShowExt' /> 

安装时该值被删除(如果您必须知道它的作用,快捷方式会显示其 .lnk 扩展名)。卸载时注册表值不会被替换(导致快捷方式永远显示其 .lnk 扩展名,这可能是件好事,但与本次讨论无关)。

如何在卸载我的产品时将注册表值取回注册表?

我现在在这里提出另一个问题...Getting a custom action to run on install and uninstall

卸载时,Windows 安装程序仅 "undoes" 安装期间在本地计算机上实际 创建 的内容。

"Side effects" 就像删除注册表 keys/values 和文件在卸载期间不会被撤销(尽管当回滚发生时,这些将按预期被撤销)。

要支持您的方案,您必须自己备份和恢复注册表值:

安装时:

  • 使用RegistrySearch得到'NeverShowExt'的现有值。您可能需要设置 Win64="yes",我不确定。

  • 在您的应用程序注册表项 (HKLM\Software\[Manufacturer]\YourProductKey) 中存储该值的备份。

卸载时:

  • 使用 RegistrySearch 从您的应用程序注册表项中获取备份值。
  • 创建将注册表值写回其原始位置的延迟自定义操作。卸载时没有向注册表写入内容的声明 "WiX way"。