DLL接口的实现(COM结构思想)一

来源:互联网 发布:淘宝上衣服尺寸怎么看 编辑:程序博客网 时间:2024/06/05 01:57

DLL接口的实现(COM结构思想)一

说到COM,我们先来看下大神对 OpenGL vs D3D 的看法:

早期的OpenGL 1.0的接口定义是C-Style的,这种API定义风格比较僵化,在扩展时只能添加函数而不能轻易的删除或修改原有的函数,而图形接口的架构变化是非常快的,2~3年就会伴随一次大的硬件架构的升级。所以到了1.1之后引入了GL Extension机制,不再增加新的API函数接口,而是让客户代码自己去通过GL扩展机制去查询当前硬件支持的特性,获取新特性的函数指针后再进行调用,同时因为使用扩展机制需要程序手工查询再取得函数指针,使用非常麻烦,所以还是增加了一些C-style的API来进行包装和简化。这样虽然使得OpenGL可以快速的跟进硬件系统的发展,但是也导致各个硬件厂商在OpenGL里随意的添加自己的私有扩展,导致平台的混乱和分裂。到了OpenGL2.0时代,大家终于坐下来着手解决这个问题,利用委员会制定的ARB扩展来统一各个厂商之间的私有扩展。但此时OpenGL的扩展已经比较发展的混乱和缓慢了,各种老的API及扩展特性原本应该被完全废弃的也因为需要考虑兼容性的缘故而不得不保留,OpenGL变得越来越庞大和难用。OpenGL这些年发展的失误,跟使用僵化的C-Style API以及采用不成熟的扩展机制是很有关系的。

早期的D3D只是OpenGL后面的一个小跟班,其功能和影响力都远不及OpenGL。但是D3D的进化速度非常的快,从95年到现在大约发布了10来个大的D3D版本。由于D3D采用了COM作为其API接口,在每次架构升级时微软都采取了大刀阔斧式的改进,所有在硬件架构升级中被淘汰的函数都不需要保留到下一代的D3D接口中,同时很多新的功能和接口都可以自由的添加到新的D3D版本中,因此新的D3D组件库不需要考虑为老版本的兼容性买单,老的客户代码依然可以用老的D3D组件库运行,新的客户代码使用新的D3D组件库来支持最新的硬件。

以上段落来自Analyst的博客 http://blog.csdn.net/Analyst/article/details/6254024


所以,用COM来写DLL的接口是不错的选择,它的思想就是将要编写的程序,拆分成一个一个小的模块。这里说明一下,可能某些人会想到COM就是DLL的实现,我想要告诉各位的是,我当时也有想到。在这告诉大家,DLL是COM存在的其中一种形式,COM是一种模式。

关于COM的介绍网上的教程应该很多,但我们如果是在开发或自己码代码的时候一般是不会用到整个COM库的,因为我们不会为了得到一个更好的解决方案而去使用一个拖垮性能的C++库。繁琐是一些C++强大的类库一直被人诟病的地方,所以一些牛人往往会自己写一些工具或框架来使用。但COM的思想还是很值得我们学习的

COM中的接口实际上是一个函数地址表,当组件实现了这个接口后,这个函数地址表中就填满了组件所实现的那些接口函数的地址。而客户也就是通过这个函数地址表获得组件中那些接口函数的指针,从而获得组件所提供的服务的。从某种意义上说,我们可以把接口理解为c++中的虚拟基类;或者说,在c++中可以用虚拟基类来实现接口!这是因为COM中规定的接口的存储结构,和c++中的虚拟基类在内存中的结构是一致的。如果对c++类的多态比较熟悉的同学应该会清楚COM的实现原理

现在介绍下COM组件的实现的一个主要部分IUnknown

class IUnknown{public:BEGIN_INTERFACEvirtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid,void __RPC_FAR *__RPC_FAR *ppvObject) = 0;virtual ULONG STDMETHODCALLTYPE AddRef( void) = 0;virtual ULONG STDMETHODCALLTYPE Release( void) = 0;END_INTERFACE};

QueryInterface用于查询组件实现的其他接口。COM规范顶任何组件、任何接口都必须冲IUnknow继承,IUnknow包括三个函数,分别是QueryInterface、AddRef、Release。这三个函数是无比重要的,而且他们的排列也是不可改变的。

IUnknow接口提供了两个非常重要的特性:生存期控制(使用引用计数器)和接口查询。QueryInterface的第一个参数ID来查询要调用的接口。AddRef用来增加引用计数器,Release释放引用计数,值到引用计数为0时将分配的内存释放,到达对调用接口资源的管理。

之后我们可以自行设计所西药的接口类来继承IUnknow来实现。我用COM结构思想简单的实现了一个DLL接口,请看下篇:http://blog.csdn.net/u011599942/article/details/11224601

 

原创粉丝点击