【问题标题】:How To Enumerate All coclasses That Implement A Particular COM Interface?如何枚举实现特定 COM 接口的所有 coclass?
【发布时间】:2018-01-29 15:00:34
【问题描述】:

我将尽可能简单地描述问题;

假设我们有一个定义了多个接口的 com 客户端。

为了改进我们com客户端的功能;几家独立的公司开发和部署了实现该接口的 com 服务器。目标机器可能有实现相同接口的 com 服务器。

现在问题来了;

我们的 com 客户端不知道目标机器上的 com 服务器,因为它们是独立开发的。但是,我们仍然可以要求独立公司遵循特定的安装程序。

现在问题来了;

我们应该使用什么样的技术来找出目标机器上部署的所有兼容的 com 服务器,然后实例化所需的对象?

【问题讨论】:

  • 那么...你想要的是枚举所有实现给定接口的 coclass 的能力?
  • @Billy,是的,这就是要解决的问题
  • 希望标题不那么糟糕。

标签: c++ com


【解决方案1】:

据我所知,没有标准的 COM 编目服务,尽管 COM+ 可能有一些东西。看看HKCR\Component Categories,您会发现组件类型的 GUID。像0DE86A57-2BAA-11CF-A229-00AA003D7352,描述为“类实现IPersistPropertyBag”。一个 coclass 在其 CLSID\{guid}\Implemented Categories 中声明了相同的 guid。这似乎很适合您的场景。

您必须选择一个 guid 并告诉组件作者。他们必须使用他们的安装程序编写实施类别密钥。

通过 CLSID 键仍然是一个相当尴尬的过程,您不想经常这样做。但至少您不必加载 DLL 来发现接口,这可能会产生各种讨厌的副作用。我建议在您的选项菜单中使用一个对话框,让用户开始扫描并进行选择,这也是禁用行为不端组件的好方法。

顺便说一句,这可能导致的支持问题通常会使应用程序从“已批准”列表中运行。

【讨论】:

    【解决方案2】:

    汉斯有个好主意。

    我之前没有使用过组件类别,但我建议您避免直接接触注册表,因为 MS 提供了 API 来访问组件类别。看看这个:

    http://msdn.microsoft.com/en-us/library/ms692551(v=vs.85).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-13
      • 2010-11-18
      • 2023-03-26
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      相关资源
      最近更新 更多