我的WiX卸载如何恢复注册表值更改?

时间:2010-03-25 18:25:26

标签: wix wix3

我使用WiX 3.0编写的安装程序使用RegistryValue元素来修改现有的注册表值(最初由我们的主要产品编写)。我试图找出一种方法来恢复用户卸载我的实用程序时的注册表值。我想避免使用自定义操作,但这可能是唯一的办法? TIA。

3 个答案:

答案 0 :(得分:3)

我这样做了。有问题的注册表值是与文件扩展名关联的应用程序,但它可以是任何注册表值。

我的第一个想法是使用“自定义操作”进行安装和卸载以保留 并分别恢复相关的regy状态。这个 看起来很简单。

我在VS2008中创建了一个安装项目,并将CA构建为javascript文件。 “on install”脚本抓住了现有的regy值并将其藏匿在一个众所周知的地方。 “on uninstall”脚本将在众所周知的位置查找,然后将在此处找到的值放回原始位置。  容易,对吗?

有两个问题:

  1. 安装期间运行的脚本,用于保留预先存在的注册表值, 在注册表已更新后运行 使用新安装的东西的值。因此,它保留了新设置,而不是MSI运行之前的设置。没用。

  2. 在卸载期间运行的脚本,在注册表值之后运行,实际上是整个目录子树, 已被删除。包括藏匿价值。所以它失去了它的状态。


  3. 为了解决这个问题,我写了another script that re-orders the custom actions,以便他们在适当的时间运行。

    实际上还有一个转折点。显然,“恢复”脚本(上 如果在删除应用程序的注册表项后运行它,则无法运行。我现在不记得了,为什么......但我也确定这个脚本在之前无法运行。不知怎的,这也没有用。

    因此,我修改了MSI以运行恢复脚本 两次。在阶段1中,它将存储的值传输到注册表中的“停车场”。 然后注册表中的应用程序的键和值被删除,但停车场仍然存在。在 阶段2,在事务保护之外,恢复脚本从停车场检索状态,恢复 文件关联,然后删除停车场。

    我不记得究竟为什么我需要分两步完成这项工作,但我记得在提出解决方案之前与它斗争了一段时间。

    它在开发中的工作方式:

    • 在VS项目中设置on installon uninstall CA
    • 构建VS安装项目
    • 运行修改MSI的后处理脚本。

    使用MSI时,它比我原先想象的要复杂一点,但它有效。

    如果您使用WiX,您可以更好地控制步骤的时间和顺序,因此可能不需要该后处理步骤。


    最后,你说你想避开CA.对我来说,CA是可以避免的,因为它们在C ++中生成很痛苦,而在.NET中生成它们通常是不合适的。但是,使用Javascript for CA非常简单。有些人认为script is the wrong tool for the CA job。我认为这是错误的。 I think script is a very good tool for this purpose。一旦你可以接受脚本作为一个好工具,那么你就不需要专注于创建自定义CA.

答案 1 :(得分:0)

注册表在卸载期间无法编写注册表值,因此必须通过自定义操作完成此操作。我认为使用脚本很糟糕。您是否选择倾听取决于您自己。我可以告诉你,就在前几天我被召唤来解决这种情况,其中一些人写了一个失败的vbscript CA,因为文件系统对象在安全锁定过程中已经取消注册。

我建议根据您的需要使用C ++或C#/ DTF。

答案 2 :(得分:0)

面对类似问题,需要在安装时更新注册表值并在卸载时恢复到以前的值。 唯一可行的解​​决方案是为此目的创建自定义操作吗?

我找到了wix的扩展,为此目的有了解决方法 link to wix extensions