自定义COM实现? 我想在UNIX型平台上实现C++中COM的自定义实现,允许我动态加载和链接面向对象代码。我认为这将基于POSIX提供的一组类似的功能来加载和调用dll的ie dlopen、dlsym和dlclose
我知道COM的基本思想是在一个公共dll(Kernel32.dll)中链接到几个函数,如QueryInterface、AddRef和Release,然后允许访问接口,这些接口只是一个函数指针表,封装了一个指向应该调用函数指针的对象的指针。这些函数通过IUnknown公开,您必须从中继承 那么这一切是如何运作的呢?有没有更好的方法来动态链接和加载面向对象的代码?从dll继承是如何工作的?对基类的每次调用是否都必须是对公开的成员函数(即private/protected/public)的调用被忽略自定义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)的调用被忽略
<>我精通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实现相当简单,除了
在用C实现时可以工作(即没有RTTI)QueryInterface
- COM的另一个方面是IDispatch,即后期绑定的方法调用和发现(只读反射)
请看一看,因为它是一个类似COM的多平台环境。这真的是你最好利用其他技术的事情之一。它可以占用大量的时间,更好地花在其他地方。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的动态库