0

我在 WiX 3.5 天创建了一个基于 WiX 的安装程序。当时的文档比现在更糟糕。更糟糕的是,这是我的第一个安装程序——所以我没有做对所有事情。

一些背景知识:安装程序安装了两个应用程序和一个驱动程序(每个都是由一个或多个组件组成的单独功能)。有问题的应用程序之一是用 VB6 编写的供应商专有设备配置应用程序。由于它是一个 VB6 应用程序,它使用库comctl32.ocxtabctl32.ocx.

问题的症结在于我没有看到这两个库%windir%\System32Windows 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)执行此操作,以免它们被删除下次升级时再次。我看到了两种方法之一:
    1. 直接创建注册表项,注意确保值与全新 Windows 安装的值匹配(适用于执行安装程序的操作系统版本)
    2. 将要创建的注册表项动态添加到 MSI 注册表表中(如果我理解正确,Windows 安装程序不会在卸载方面对其进行跟踪?)

如果在卸载时删除了以前由 MSI 覆盖的现有注册表项,则:

  1. 我提出的解决方案可以接受吗?
  2. 替换已删除的注册表项的两个选项中哪一个最好?
  3. 如果这两个选项都不可接受,是否有人对我如何纠正这种情况有任何其他建议,以免破坏(可能)依赖相关库的其他应用程序?
4

2 回答 2

1

这是一个很长的阅读,但我认为这就是你正在寻找的:

ICE09

引用啤酒广告......我并不总是在 SystemFolder 中安装文件,但当我这样做时,我会将它们永久保存。

于 2013-11-02T04:22:57.620 回答
0

首先,感谢上面的Christopher Painter回答了我的问题;但是,从某种意义上说,这并不是我正在寻找的真正答案——修复“在野外”的现有安装程序。不过,在他关于小幅升级的最后评论中,这可能对某些人有用。

接下来,感谢Aaron Stebner回复了我的电子邮件,请求就同一问题提供指导。他的建议是编写一个没有 ID 的 MSI 组件。通过将此类组件编写到 MSI 中,MSI 不会跟踪该组件;本质上,它变成了一个永久的、可卸载的组件。如果完全有必要,这可能适用于这种情况。

但是,在做了一些研究之后,我相信通过删除我上面概述的注册表项来破坏用户系统的风险并不大。

我将 Windows XP SP3 和 Windows Vista SP1 的新副本加载到虚拟机中。开箱即用,这些版本的 Windows 都没有在 Windows 注册表中注册有问题的 COM 组件。这是有道理的,因为从 Windows XP 开始,已经有了免注册的 COM 注册。Windows 8.1 也继续存在这种情况——这也是意料之中的。

如果这些注册表项被卸载,可能发生的最坏情况是机器上依赖此类注册表项的其他一些旧软件最终可能会损坏(例如,该软件是从 90 年代末到 2000 年代初的时代,并且使用了非-MSI 安装程序和/或全局安装 COM 库——他们一开始就不应该这样做——就像我一开始不应该这样做一样;))。此时,用户可以使用regsvr32.exe或修复/重新安装有问题的应用程序重新注册 COM 库。在当今时代,此类应用程序存在的可能性微乎其微。

于 2013-11-06T20:21:33.230 回答