自定义COM实现?

时间:2010-01-27 21:26:53

标签: c++ com

我希望在UNIX类型平台上用C ++实现COM的自定义实现,以允许我动态加载和链接面向对象的代码。我认为这将基于POSIX提供的类似功能集来加载和调用dll,即dlopen,dlsym和dlclose。

我理解COM的一般思想是你链接到一些函数,即QueryInterface,AddRef和Release在一个公共dll(Kernel32.dll)中,然后允许你访问只是一个封装的函数指针表的接口带有指向应该调用函数指针的对象的指针。这些函数通过IUnknown公开,你必须继承它。

那么这一切如何运作?有没有更好的方法来动态链接和加载到面向对象的代码?如何从dll继承工作 - 对基类的每次调用都必须是暴露的成员函数,即private / protected / public是否被忽略?

我非常精通C ++和模板元编程,并且已经有一个完全反映的C ++系统,即成员属性,成员函数和使用boost的全局/静态函数。

6 个答案:

答案 0 :(得分:6)

要记住以下几点:

  • COM的强大功能主要来自IDL和midl编译器。它允许使用为您生成的所有C / C ++样板文件定义对象和接口的verry succint。

  • COM注册。在Windows上,类ID(CLSID)记录在注册表中,它们与可执行文件相关联。您必须在UNIX环境中提供类似的功能。

  • 整个IUnknown实现相当简单,只有QueryInterface在C中实现时才有效(即没有RTTI)。

  • COM的另一个方面是IDispatch - 即后期绑定方法调用和发现(只读反射)。

看看XPCOM,因为它是一个多平台的COM环境。这真的是你利用其他技术更好的事情之一。它可以吸引很多时间在其他地方更好。

答案 1 :(得分:4)

答案 2 :(得分:3)

为了真正理解COM是如何工作的,我建议阅读Don Box的“Essential COM”。

答案 3 :(得分:3)

查看sscli中System.ComponentModel的CORBA文档,即Mozilla代码库的XPCOM部分。 Miguel de Icaza在GNOME中实现了一个名为Bonobo的OLE,它也可能很有用。

根据您使用C ++所做的事情,您可能希望查看像Yehia这样的C ++插件框架。我相信Boost也有类似的东西。

编辑:pugg目前似乎比Yehia保持得更好。我没试过。

答案 4 :(得分:3)

COM的基本设计非常简单。

  1. 所有COM对象通过一个或多个接口公开其功能
  2. 所有接口都是从IUnknown接口派生的,因此所有接口都具有  QueryInterface,AddRef&释放方法作为其虚拟的前3种方法  功能表按已知顺序
  3. 所有对象都实现了IUnknown
  4. 可以从任何其他界面查询对象支持的任何接口。
  5. 接口由全局唯一标识符标识,这些是IID GUID或CLSID,但它们都是完全相同的。 http://en.wikipedia.org/wiki/Globally_Unique_Identifier
  6. COM变得复杂的地方在于它如何处理允许从对象所在的进程外部调用接口。 COM编组是一种讨厌的毛茸茸的野兽。因为COM支持单线程和多线程编程模型,所以更是如此。

    COM的Windows实现允许对象被注册(Windows注册表的原始用途是用于COM)。 COM注册表至少包含COM对象的唯一GUID与包含它的代码的库(dll)之间的映射。

    为此工作。实现COM对象的DLL必须具有ClassFactory - DLL中的入口点,其标准名称可以被调用以创建DLL实现的COM对象之一。 (实际上,Windows COM从此入口点获取IClassFactory对象,并使用它来创建其他COM对象。)

    所以这是10美分之旅,但要真正理解这一点,你需要阅读Don Box的Essential COM

答案 5 :(得分:2)

您可能对(尚未)Boost.Extension库感兴趣。