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

自定义COM实现? 我想在UNIX型平台上实现C++中COM的自定义实现,允许我动态加载和链接面向对象代码。我认为这将基于POSIX提供的一组类似的功能来加载和调用dll的ie dlopen、dlsym和dlclose,c++,com,C++,Com,我知道COM的基本思想是在一个公共dll(Kernel32.dll)中链接到几个函数,如QueryInterface、AddRef和Release,然后允许访问接口,这些接口只是一个函数指针表,封装了一个指向应该调用函数指针的对象的指针。这些函数通过IUnknown公开,您必须从中继承 那么这一切是如何运作的呢?有没有更好的方法来动态链接和加载面向对象的代码?从dll继承是如何工作的?对基类的每次调用是否都必须是对公开的成员函数(即private/protected/public)的调用被忽略

我知道COM的基本思想是在一个公共dll(Kernel32.dll)中链接到几个函数,如QueryInterface、AddRef和Release,然后允许访问接口,这些接口只是一个函数指针表,封装了一个指向应该调用函数指针的对象的指针。这些函数通过IUnknown公开,您必须从中继承

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


<>我精通C++和模板元编程,已经有了一个完全反射的C++系统,即成员属性、成员函数和全局/静态函数,使用Boosi.

来真正理解COM的工作原理,我建议阅读DON BOX的“必要COM”。< /P> < P>查看CORBA文档,在sscli中的

System.ComponentModel
中,XPCOM是Mozilla代码库的一部分。Miguel de Icaza在GNOME中实现了类似OLE的东西,称为

根据你使用C++的方式,你可能想看看C++的插件框架,比如Yehia。我相信Boost也有类似的功能


编辑:目前似乎比Yehia更好维护。不过我还没有试过。

有几件事需要记住:

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

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

  • 整个IUnknown实现相当简单,除了
    QueryInterface
    在用C实现时可以工作(即没有RTTI)

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


请看一看,因为它是一个类似COM的多平台环境。这真的是你最好利用其他技术的事情之一。它可以占用大量的时间,更好地花在其他地方。

COM的基本设计非常简单

  • 所有COM对象都通过一个或多个接口公开其功能
  • 所有接口都派生自IUnknown接口,因此所有接口都具有 QueryInterface、AddRef和Release方法作为其虚拟数据库的前3个方法 按已知顺序排列的函数表
  • 所有对象都实现IUnknown
  • 可以从任何其他接口查询对象支持的任何接口
  • 接口由全局唯一标识符标识,这些标识符是IID GUID或CLSID,但它们实际上都是一样的 COM变得复杂的地方在于它如何处理允许从对象所在的进程外部调用接口的问题。COM编组是一种肮脏、多毛的野兽。COM同时支持单线程和多线程编程模型,这一事实使得情况更加严重

    COM的Windows实现允许注册对象(Windows注册表最初用于COM)。COM注册表至少包含COM对象的唯一GUID与包含其代码的库(dll)之间的映射

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


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

    > P>您可能对(尚未)库感兴趣。

    <强>我正在尝试在UNIX类型平台上实现C++中COM的自定义实现,以允许我动态加载和链接面向对象代码。我认为这将基于POSIX提供的一组类似功能,用于加载和调用dll的ie dlopen、dlsym和dlclose。

    在最简单的层次上,COM是通过接口实现的。在C++中,如果您对纯虚拟或抽象基类的概念感到满意,那么您就已经知道如何在C++

    中定义接口。
    struct IMyInterface {
      void Method1() =0;
      void Method2() =0;
    };
    
    COM运行时提供了许多适用于windows环境的额外服务,但在单个应用程序中实现“迷你”COM时,它并不是真正需要的,因为它可以动态链接到一个比dlopen、dlsym等传统允许的更多OO接口

    COM对象在.dll、.so或.dylib文件中实现,具体取决于您的平台。这些文件需要导出至少一个标准化的函数:DllGetClassObject

    在您自己的环境中,您可以根据需要对其进行原型化,但要与windows上的COM运行时进行互操作,显然名称和参数需要符合COM标准

    其基本思想是,将一个指向GUID的指针传递给特定对象,该GUID是唯一分配给特定对象的16字节,它创建(基于GUID)并返回factory对象的IClassFactory*

    当调用IClassFactory::CreateInstance方法时,COM运行时将使用factory对象创建对象的实例

    到目前为止,你已经做到了

    • 导出至少一个sy的动态库