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

我的WiX卸载如何恢复注册表值更改?,wix,wix3,Wix,Wix3,我正在使用WIX3.0编写的安装程序使用RegistryValue元素修改现有的注册表值(最初由我们的主产品编写)。我试图找出一种方法,在用户卸载我的实用程序时恢复注册表值。我想避免使用自定义操作,但这可能是唯一的办法?TIA.我做了这个。所讨论的注册表值是与文件扩展名关联的应用程序,但它可以是任何注册表值 我的第一个想法是使用“自定义操作”进行安装和卸载以保留 和分别恢复关联的regy状态。这 看起来很简单 我在VS2008中创建了一个安装项目,并将CA构建为javascript文件。“on

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

我做了这个。所讨论的注册表值是与文件扩展名关联的应用程序,但它可以是任何注册表值

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

我在VS2008中创建了一个安装项目,并将CA构建为javascript文件。“on install”脚本获取了现有的regy值并将其隐藏到一个众所周知的地方。“on uninstall”脚本将在众所周知的地方查找,然后将在那里找到的值放回原始位置。 简单,对吗

有两个问题:

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

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


  • 为了解决这个问题,我写了一篇文章,让它们在适当的时间运行

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

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

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

    它在开发中的工作方式:

    • 在VS项目中设置安装时的
      和卸载时的
      CA
    • 构建VS安装项目
    • 运行修改MSI的后处理脚本
    当使用MSI时,它比我最初认为的要复杂一点,但它可以工作

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



    最后,你说你想避免一个CA。对我来说,CA是避免的,因为它们在C++中产生痛苦,在.NET中生成它们通常是不合适的。但是,将Javascript用于CA非常简单。有些人认为。我认为这是错误的。一旦你能接受脚本作为一个好的工具,那么你就不必对创建自定义CA束手无策。

    注册表表在卸载过程中无法写入注册表值,因此必须通过自定义操作来完成这一点是正确的。我认为使用脚本是不好的。你是否选择倾听取决于你自己。我可以告诉你,就在前几天,我被叫去解决一个问题,其中一些人编写了一个vbscript CA,但失败了,因为作为安全锁定过程的一部分,文件系统对象已被注销


    <>我根据您的需要建议C++或C/d/df。

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

    我找到了wix的一个扩展,它具有用于此目的的功能

    谢谢!我感谢你在回答中分享你对同一问题的经验。这非常有帮助,我已经意识到,在我所拥有的时间里,编写类型1 CA可能是处理这个问题的最好方法。你的剧本给人留下了深刻的印象(!),但我不打算那么努力。:-)因为我使用的是WiX,所以我会看看是否可以使用CA+DLL来做正确的事情。关于脚本CA的事情:你会惊讶地发现,有多少商店出于安全原因仅仅禁用了windows脚本主机基础结构。当我为我们的一个安装程序编写第一个自定义CA脚本时,我发现了这一点。