1

我在 Visual Studio 中有一个安装项目。作为常规安装的一部分,它会在 Windows 注册表中创建/更新一些键和值。如何使更新可逆?

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

当安装期间写入的密钥之一中存在现有值时,问题就出现了。假设它的值为 1。然后在新安装时它的值为 100。卸载后,它根本没有任何值 - 值消失了。


我试图通过“自定义操作”来解决这个问题。

在安装期间,如果用户确认,msiexec 会将值写入注册表。以前在注册表项中的任何内容都消失了。(我们称之为“更新 A”)

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

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

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

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

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

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


我可以通过使用WindowsInstaller.Installer类的 Javascript 构建后事件来执行此操作吗? Aaron Stebner 发布了一个脚本,其中添加了“安装后启动应用程序?” Visual Studio 生成的 MSI 对话框。Windows Installer 支持“启动应用程序”功能,但它并未在 VS2008/2005 的设计器中公开。一个快速的 biolerplate 脚本,在 VS 中作为构建后步骤运行,添加到 Launch 对话框中。

自定义操作的排序是否有类似的可能?

4

1 回答 1

1

给我一些答案:

  • 是的,可以通过在 Javascript 中实现的后期构建步骤来做到这一点。
  • 是的,我会使用 WindowsInstaller.Installer 类。
  • 是的,逆戟鲸是解决这一切的必要条件

Orca 清楚地显示了旨在恢复注册表值的自定义操作在删除注册表值的内置操作之前运行。

逆戟鲸

所以我必须编写一个脚本将 1698 更改为 2620,并且注册表值应该可以正确恢复。


编辑:没那么快。这个想法是对的,但并不是改变序列号那么简单。问题是,“保留”的注册表值位于被卸载程序删除的注册表树中。因此,这两个命令都不起作用。如果 A 是恢复,B 是删除,AB 将恢复注册表只是为了稍后删除恢复的值。BA 会先删除该值,然后 A 将没有要恢复的值。原因是A(恢复部分)将要恢复的值存储在要删除的树中。

所以正确的操作必须是 A-B-A, where A获取要恢复的存储值,并将其放在不会被 B 删除的位置。然后 B 删除注册表中特定于应用程序的键和值。A 恢复被 A` 锁住的设置。

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

于 2009-08-31T10:44:03.080 回答