我在WiX 3.5天后创建了一个基于WiX的安装程序。那时的文档比现在更糟糕。更糟糕的是,这是我第一次安装—,所以我没有做正确的事情。WiX:使用新版本安装程序“修复”原始版本卸载问题的合理方法
一些背景:安装程序安装了两个应用程序和一个驱动程序(每个驱动程序都是由一个或多个组件组成的独立功能部件)。有问题的应用之一是用VB6编写的供应商专有设备配置应用程序。由于它是一个VB6应用程序,因此它使用库comctl32.ocx
和tabctl32.ocx
。
问题的症结在于我没有看到Windows Vista(和/或Windows XP上的%windir%\System32
文件夹中的这两个库?我不记得,自从我第一次写这个安装程序已经有几年了)。所以我想我需要安装这两个库以及所有必需的COM注册表项。 (我最终将COM库安装在我的应用程序文件夹—中,就像您为私有程序集一样,但是在HKLM中全局注册它们。)我创建第一个安装程序时读到的东西,我从来没有发现过,从Windows XP开始,COM组件可以并排安装。 (即便如此,为什么我没有使用MSI表格Clsid,ProgId等—,这些表格今天被认为是不被接受的,但它至少会比我所做的更正确?但是我离题了;完成了什么在MSI的土地完成)无论如何,创建原始安装程序的时候,我用下面的WiX的标记创建的COM注册表值:
<RegistryValue ... Action="write" />
我还要提到的是在那个时候,我还没有遇到任何来就像我这次有种'组件规则101'那样的文档。所以,这个MSI不遵循组件规则。 MSI为每个COM库及其关联的注册表值包含一个组件,COM库为其组件的KeyPath
。
问题是,如果在原始MSI运行并安装我的产品的第一个版本之前存在注册表项/值,卸载会导致这些键/值从系统中删除?(我假设这些键/值是在Windows安装过程中创建的—,所以他们已经引用了计数?)我不想在依赖这些库的用户系统上打破其他应用程序。
如果回答上述是肯定的,那么我目前的计划,以纠正这种情况是:
- 作者新的MSI为
<MajorUpgrade />
—毕竟,我是执行升级。 - 提供comctl32.ocx和tabctl32.ocx COM库原始安装程序中的COM注册表项—我在猜测我需要用CA(或多个CA)来做到这一点,在下次升级时再次移除。我看到的完成这两种方法之一:
- 直接创建照顾,以确保该值的注册表项匹配全新的Windows安装(适当OS的版本上安装程序正在执行)
- 动态将要创建的注册表项添加到MSI注册表中(如果我理解正确,则不会在卸载方面跟踪Windows安装程序?)
如果MSI覆盖先前存在的注册表项上卸载删除,那么:
- 是我提出的解决方案可以接受吗?
- 用于替换已删除注册表项的两个选项中哪一个最好?
- 如果这两个选项都不可接受,那么是否有人会对我如何纠正这种情况有任何其他建议,以免打破可能依赖于相关库的其他应用程序?
我越想到这个问题,就越觉得我无法修复它。我将COM库安装在我的应用程序文件夹中,但手动将它们全局注册(即在HKLM中)。不好!我不知道是否有任何其他用户应用程序可能依赖这些库,如果有的话,那些相应的安装程序可能已安装它们。所以,当我的产品卸载时,我不知道要在哪里指出,RegSvr32,重新注册他们的系统。奇怪的是,这ICE从来没有出现在原来的发展:(。 – fourpastmidnight
顺便说一句,我知道一个很长的“问题”,但最初的安装者已经在野外多年了。 :(现在只是我试图“升级”安装以包含一个64位驱动程序,在这个过程中,我发现我的原始安装程序存在严重错误 – fourpastmidnight
有时候作为补丁发货的小升级有助于修复现有的安装程序在删除它之前。 –