【问题标题】:Questions about COM/ActiveX objects关于 COM/ActiveX 对象的问题
【发布时间】:2010-10-01 09:09:52
【问题描述】:

我对“传统”.dll 的工作有很好的了解。还有dynamic loadingstatic loading的区别等。

但我对COM对象的工作有以下疑问,

  • 是否必须使用regsvr32 注册 COM 对象?
  • 我可以有两个版本的注册COM object 位于相同/不同的目录中吗?
  • 除了封装在 .dll 文件中之外,“传统”.dllCOM object 之间是否有任何共同点?

【问题讨论】:

    标签: c++ c com dll activex


    【解决方案1】:

    1) 否 - 不需要注册 COM 对象。创建 COM 对象需要注册。有许多需要 COM 对象的接口(COM 或本机函数)。他们的 API 告诉你你的 COM 对象应该支持哪个接口。由于您传入一个现有的 COM 对象,因此它们不需要注册信息来创建您的 COM 对象。此方案的一个变体是运行对象表,您可以在其中注册创建的 COM 对象。这些对象也是您创建的,您不需要注册信息。

    示例接口:IQueryCancelAutoplay。

    2) COM object 存在于内存中。您可能正在考虑一个 COM class,它在 DLL 及其 COM 工厂中实现。 COM 类由它们的 GUID 注册。您可以有多个类=每个 DLL 的 GUID,但每个类只有一个 DLL。请记住,调用者向 COM 请求您的类的一个实例。如果有两个 DLL 实现同一个类,COM 会加载哪个 DLL?! 当然,可以有两个 DLL,每个 DLL 都实现一个类,这两个类共享一些接口。他们将始终共享 IUnknown,例如,通常是 IDispatch,但很少是 IAcmeCorpFooBrv2

    3) COM DLL 一个普通的 DLL,它 (a) 公开了一些特定于 COM 的函数,并且 (b) 已注册,因此 COM 框架可以在其上调用 LoadLibrary。 DLL 还可能公开其他非 COM 函数。因此,您可以自己在 COM DLL 上调用 LoadLibrary。这有时对于减少创建第一个 COM 对象所涉及的延迟很有用。

    【讨论】:

      【解决方案2】:

      是的,COM 程序集已注册,以便 COM 基础结构知道它们的存在。 DLL 是通过注册 CLSID 而不是路径找到的。

      如果名称不同,两个版本可以共存(显然,文件夹中不能有相同名称的文件)。

      所有的 COM 对象都实现了特定的接口(IUnknown,很多都有 IDispatch)。 COM 的工作原理实际上是一个超出我们可以在此处发布的主题的方式。你可能会得到一本 ATL Internals 之类的书,或者阅读一些在线 COM 教程。

      【讨论】:

        【解决方案3】:

        1)如果您不使用名为Reg-Free COM的东西,则必须注册它

        2) 两个具有相同 CLSID 到 ProgID 映射的 COM 对象无法注册。

        3) 最终,传统 dll 和 COM dll 都包含机器代码。如果不是为了实现接口,那么您编写代码的方式也没有太大区别。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-17
          • 2012-11-14
          • 2010-11-06
          • 1970-01-01
          • 2011-02-01
          • 2011-02-27
          • 2011-06-07
          • 1970-01-01
          相关资源
          最近更新 更多