我对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无法恢复到旧路径,还是我缺少的东西?
答案 0 :(得分:4)
Windows安装程序将为您执行此操作,但前提是您的COM组件在A和B上都具有相同的GUID,(两个应用程序将dll安装在同一位置。)
Windows安装程序通过引用计数每个组件(在整个系统中)来工作。组件由其GUID标识。
如果COM组件具有相同的GUID,则会发生以下情况:
如果它没有相同的GUID,那么会发生什么
编辑从评论中提升:
除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引用计数在卸载时完成其工作。