2009-08-31 121 views
1

我在Visual Studio中有一个安装项目。作为常规安装的一部分,它会在Windows注册表中创建/更新某些键和值。我怎样才能使更新可逆?VS安装项目;如何在卸载时恢复注册表值?

你可能会说“他们是可逆的”,但我不这么认为。以下是我认为它的工作原理:使用VS设计器来指定您想要的注册表项和值。这些键和值在安装过程中写入,在卸载过程中被删除。简单。什么是不可逆的?

当安装过程中写入的某个键中存在某个值时,会出现问题。假设它的值为1.然后在新安装时,它的值为100.卸载后,它根本没有任何价值 - 价值已经消失。


我试着用“自定义操作”来解决这个问题。

安装期间,如果用户确认,msiexec将值写入注册表。无论在注册表键之前,都不见了。 (我们称之为“更新A”)

要保留该值,在安装时,会有一个自定义操作读取并保留“before”设置。它在“更新A”之前运行。到现在为止还挺好。

在卸载时,正常的操作过程是删除安装期间添加的常规注册表项和值。这工作得很好。称这个“更新B”。

要还原原始注册表值,我有另一个“自定义操作”。这个在卸载时运行。它成功地将原始值恢复到注册表中。注册表看起来就像在最初的安装之前一样。我验证了这可以使用ProcMon(一种让我监视注册表更新等的工具)。调用这个“更新C”。

只有一个问题。在卸载时,更新B正在发生更新C.这意味着,在自定义操作恢复原始注册表设置后,msi会清除还原的值,就像它处理所有其他注册表更新一样。

结果是注册表具有空值而不是恢复的值。

任何帮助?我如何重新排列更新?我需要Orca吗?我真的不想安装和学习另一种工具来实现这一点。我也希望它是自动的。绝对不想通过一个MSI编辑器直观地点击来实现这一点。


我可以通过使用WindowsInstaller.Installer类的Javascript后期构建事件来做到这一点吗? Aaron Stebner published a script添加了“安装后启动应用程序?”对话框到由Visual Studio生成的MSI。 Windows Installer支持“启动应用程序”功能,但未在VS2008/2005的设计人员中公开。在启动对话框中添加一个快速生成器脚本,作为VS中的后期构建步骤运行。

与自定义操作的排序可能类似吗?

回答

1

我一些答案:

  • 是的,这可能与JavaScript实现一个postbuild一步做到这一点。
  • 是的,我会使用WindowsInstaller.Installer类。
  • 是,逆戟鲸必要弄清楚这一切

奥卡清楚地表明,旨在恢复注册表值运行自定义操作之前,内置的动作,消除注册表值。

orca http://i31.tinypic.com/33vc02b.jpg

所以我必须写一个脚本来改变1698年至2620年,和注册表值应该得到适当的恢复。


编辑:没那么快。 这个想法是对的,但它不像改变序列号那么简单。问题是,“保存的”注册表值位于注册表树中,被卸载程序删除。因此,这两个订单都无效。如果A是恢复,B是删除,则A-B将仅恢复注册表,以便稍后删除恢复的值。 B-A将首先删除该值,然后A将无法恢复。原因是A(恢复部分)将要恢复的值存储在要删除的树中。

因此,正确的操作必须是类似于A -B-A, where A的东西,它将存储的要恢复的值存储在一个不会被B删除的位置。然后B删除特定于应用程序的键并值在注册表中。 A恢复被A`剪掉的设置。

为了做到这一切,我必须在MSI文件上做一些手术,因为Visual Studio中的香草MSI设计器不允许设置特定的序列号。你需要使用Orca,这是一个GUI工具,或者,在我的情况下,我使用COM接口到WindowsInstaller,通过javascript自动执行更改。

相关问题