gpt4 book ai didi

com - WIX:删除两个程序之一时 COM 注销

转载 作者:行者123 更新时间:2023-12-04 19:22:25 27 4
gpt4 key购买 nike

我对 WiX 比较陌生。这是一个很棒的工具,但我还需要一些时间
更好地学习它。
我遇到了一个COM注册和注销的问题
成分。我为两个应用程序创建了安装程序,我们称它们为 A
和 B. 两者都使用相同的 COM 组件。我使用了加热工具,因为
受到推崇的。安装 A 或 B 时,组件注册时没有任何
问题。

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

任何帮助,将不胜感激,

此致,
疯狗

编辑:感谢您的回复。我在两个安装程序中将 GUID 设置为相同的值,现在正在正确删除注册表项,即从系统中删除最后一个程序。
然而,问题仍然存在是有原因的。我已经检查了 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 是否无法恢复到旧路径,还是我遗漏了什么?

最佳答案

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

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

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

  • 安装 A:组件引用计数从 0->1,Windows 安装程序注册它
  • 安装 B:组件引用计数从 1->2,没有任何 react
  • 卸载 A:组件引用计数从 2->1,没有任何 react
  • 卸载 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" 设置哪个文件是“ key ”文件。 .如果组件包含一个或多个注册表项,则类似。

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

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

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

    关于com - WIX:删除两个程序之一时 COM 注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2488840/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com