WIX:删除两个程序之一时COM取消注册

mad*_*ger 5 com wix uninstall registration

我对WiX比较陌生.这是一个很棒的工具,但我仍然需要一些时间来更好地学习它.我遇到了注册和取消注册COM组件的问题.我已经为两个应用程序创建了安装程序,我们可以将它们称为A和B.两者都使用相同的COM组件.我按照建议使用了加热工具.安装A或B时,组件注册没有任何问题.

但是当我安装A和B,然后删除A(使用添加/删除程序)COM类未注册,B不能再使用它.有没有一个干净的解决方案来防止这种情况发生?我想在卸载A和B时取消注册COM.

任何帮助,将不胜感激,

最好的问候,madbadger

编辑:谢谢你的回复.我在两个安装程序中将GUID设置为相同的值,现在正在正确删除注册表项,即从系统中删除最后一个程序.
Hovewer,问题仍然存在,原因之一.我在HKEY_CLASSES_ROOT/CLSID/[相应的COM GUID]下检查了注册表.这是发生的事情:
- 我安装A并将COM的路径设置为[A/component.dll的路径]
- 我安装B并将COM路径设置为[路径到B/component.dll]
- 我删除B和COM的路径仍然是[B/component.dll的路径]
- 现在A无法通过注册来访问COM组件,因为[B/component.dll的路径]不再存在

现在我假设将COM组件放在两个应用程序的同一目录中是必须的.Windows Installer无法恢复到旧路径,还是我缺少的东西?

Ori*_*rds 4

Windows 安装程序将为您执行此操作,但前提是您的 COM 组件在 A 和 B 上具有相同的 GUID (并且两个应用程序将 dll 安装在同一位置)。

Windows 安装程序通过对每个组件(整个系统)进行引用计数来工作。组件通过其 GUID 进行标识。

如果 COM 组件具有相同的 GUID,则会发生以下情况:

  • 安装 A:组件引用计数从 0->1,Windows 安装程序注册它
  • 安装 B:组件引用计数从 1->2,没有任何反应
  • 卸载 A:组件引用计数从 2->1,没有任何反应
  • 卸载 B:组件引用计数从 1->0,Windows 安装程序将其取消注册

如果它没有相同的 GUID,会发生什么

  • 安装 A:组件 A 引用计数从 0->1,Windows 安装程序注册它
  • 安装 B:组件 B 引用计数从 0->1,Windows 安装程序注册它,覆盖组件 A 的注册表项。
  • 卸载 A:组件 A 引用计数从 1->0,Windows 安装程序取消注册它,删除注册表项。
    -- 看起来这就是你所处的情况
  • 卸载 B:组件 B 引用计数从 1->0,Windows 安装程序取消注册它,删除注册表项(但它们已经被删除)

编辑从评论中提升:

除了 GUID 之外,每个组件还有一个“关键路径”。如果组件包含一个或多个文件,则应使用KeyPath="foo.dll". 如果该组件包含一个或多个注册表项,则情况类似。

当检查是否安装了某些东西时,Windows安装程序将检查GUID,读取关键路径,然后检查关键路径处的文件(这就是它如何确定东西是什么版本等),所以如果2个组件有相同的 GUID,它们还必须具有相同的密钥路径,该路径必须在安装产品时解析到文件系统中的相同位置。

这是一种冗长的说法,表示两个安装程序必须将共享文件放在同一位置。至于把它们放在哪里,System32 不是一个好地方。

我建议在公共文件文件夹下的某个地方(通常Program Files\Common Files\YourCompanyName)。你可以像这样在 Wix 中输入:Directory="[CommonFilesFolder]\YourCompanyName"