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

时间:2010-03-21 21:41:14

标签: com wix registration uninstall

我对WiX比较陌生。这是一个很棒的工具,但我还需要一些时间 更好地学习它。 我在注册和取消注册COM时遇到了问题 零件。我已经为两个应用程序创建了安装程序,我们称之为A 和B.两者都使用相同的COM组件。我使用了加热工具,如 推荐的。安装A或B时,组件未经任何注册 问题。

但是当我安装A和B时,则删除A(带有添加/删除程序)COM class被取消注册,B不再使用它。有干净吗? 解决方案,以防止这种情况发生?我想取消注册COM 当A A和B都被卸载时。

任何帮助将不胜感激,

祝你好运, 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无法恢复到旧路径,还是我缺少的东西?

3 个答案:

答案 0 :(得分: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:组件引用计数从0-> 1,Windows安装程序注册
  • 安装B:组件B引用计数从0-> 1开始,Windows安装程序注册它,覆盖组件A中的注册表项。
  • 卸载A:组件引用计数从1-> 0开始,Windows安装程序取消注册,删除注册表项。
    - 好像这就是你所处的情况
  • 卸载B:组件B引用计数从1-> 0开始,Windows安装程序取消注册,删除注册表项(但它们已被删除)

编辑从评论中提升:

除GUID外,每个组件还有一个“密钥路径”。如果组件包含一个或多个文件,则应使用KeyPath="foo.dll"设置哪个文件是“密钥”文件。如果组件包含一个或多个注册表项,则它类似。

当检查是否安装了某些东西时,Windows安装程序将检查GUID,读取密钥路径,然后检查密钥路径上的文件(这是它如何确定版本的内容,以及其他内容),所以如果2个组件具有相同的GUID,它们必须也具有相同的密钥路径,当安装产品时,必须解析到文件系统中的相同位置。

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

我建议在common files文件夹下(通常为Program Files\Common Files\YourCompanyName)。你可以在Wix中输入这个:Directory="[CommonFilesFolder]\YourCompanyName"

答案 1 :(得分:1)

在您的Component标签中,您是否在每个安装程序中使用相同的Guid?

答案 2 :(得分:0)

您应该将此常用组件包装在合并模块中,并从您的两个应用程序中引用它。

这将自动让共享dll引用计数在卸载时完成其工作。

相关问题