我在 WiX 3.5 天创建了一个基于 WiX 的安装程序。当时的文档比现在更糟糕。更糟糕的是,这是我的第一个安装程序——所以我没有做对所有事情。
一些背景知识:安装程序安装了两个应用程序和一个驱动程序(每个都是由一个或多个组件组成的单独功能)。有问题的应用程序之一是用 VB6 编写的供应商专有设备配置应用程序。由于它是一个 VB6 应用程序,它使用库comctl32.ocx
和tabctl32.ocx
.
问题的症结在于我没有看到这两个库%windir%\System32
Windows Vista 上的文件夹(和/或 Windows XP?我不记得了,自从我第一次编写这个安装程序以来已经有好几年了)。所以我想我需要安装这两个库以及它们所有必需的 COM 注册表项。(我最终将 COM 库安装在我的应用程序文件夹中 - 就像您安装私有程序集一样,但在 HKLM 中全局注册了它们。)尽管我在创建第一个安装程序时读到了很多东西,但我从来没有遇到过这样一个事实: ,从 Windows XP 开始,COM 组件可以并排安装。(即便如此,我为什么不使用 MSI 表 Clsid、ProgId 等——今天,这已被认可,但它至少比我所做的更正确?但我离题了;做了什么是在 MSI 土地上完成的。)无论如何,在创建原始安装程序时,
<RegistryValue ... Action="write" />
我还应该提到,当时我没有遇到过任何类型的“组件规则 101”类型的文档,就像我这次遇到的那样。因此,此 MSI 不遵循组件规则。MSI 为每个 COM 库及其关联的注册表值包含一个组件,其中 COM 库是KeyPath
其组件的。
问题是,如果在我的原始 MSI 运行和安装我的产品的第一个版本之前存在注册表键/值,卸载是否会导致这些键/值从系统中删除?(我假设这些键/值是在 Windows 设置期间创建的——那么它们是否已经被引用计数了?)我不想破坏依赖于这些库的用户系统上的其他应用程序。
如果上面的答案是肯定的,那么我目前的整改计划是:
- 创作一个新的 MSI 作为
<MajorUpgrade />
- 毕竟,我正在执行升级。 - 提供 comctl32.ocx 和 tabctl32.ocx COM 库的原始安装程序中的 COM 注册表项——我猜我需要对一个 CA(或多个 CA)执行此操作,以免它们被删除下次升级时再次。我看到了两种方法之一:
- 直接创建注册表项,注意确保值与全新 Windows 安装的值匹配(适用于执行安装程序的操作系统版本)
- 将要创建的注册表项动态添加到 MSI 注册表表中(如果我理解正确,Windows 安装程序不会在卸载方面对其进行跟踪?)
如果在卸载时删除了以前由 MSI 覆盖的现有注册表项,则:
- 我提出的解决方案可以接受吗?
- 替换已删除的注册表项的两个选项中哪一个最好?
- 如果这两个选项都不可接受,是否有人对我如何纠正这种情况有任何其他建议,以免破坏(可能)依赖相关库的其他应用程序?