我爱Aspx >> VC.Net >> Com IntroductionCOM组件正是基于Adapter Pattern创建的。首先,你获得IUnknow接口,你需要某个服务的时候,才从IUnknow接口出发,去查找特定的接口。
通过上面的分析,我们可以看到,Java对象和COM组件很相像。但两者的实现机制却大不相同,Java对象根据Java语言的特性实现,所有的接口实现都包含同一个类中。又有人要说了,Java对象也可以包含一些其它对象,把一些操作交给这些对象。我这里说的是,这同一个类必须显示地声明,实现所有的接口。比如
class MyObject implements Comparable, Serializable, Interface1, …, interface n.
只有这样,obj instanceof Comparable,obj instanceof Interface1这样的语句才能返回真。
COM组件没有这样的限制。COM组件只返回二进制的VTable。COM组件本身可以不实现这些VTable,可以返回其它组件的VTable。不同的接口,可以在同一个组件中实现,也可以在不同的组件中实现。这也就是COM重用的“聚合”和“包含”等概念。
而且,COM组件的生存状态也很灵活,可以存在于客户程序的进程空间,称为进程内组件,也可以存在于独立于客户程序的进程空间,称为进程间组件。
当一个COM组件(我们称这个组件为A)的queryInterface方法返回其它组件(我们称这个组件为B)时,我们来看,现在,A组件的地位很像B组件的组件工厂,通过A组件创建B组件。我们现在可以明白,为什么不直接创建组件,而要采用一种不直观的方法,通过另一个组件——工厂组件来创建组件。这样,组件创建的概念就统一起来了——组件通过工厂组件创建。
我不知道,这是一种巧合,还是一种设计上的深思熟虑。不管怎样,COM组件的设计构思给了我深深的震撼,真是巧夺天工。
注意,由于queryInterface的自反性要求,实际上的处理要复杂一些。queryInterface的自反性:组件A的queryInterface返回组件B的接口,那么,调用这个组件B的queryInterface,也能够查到组件A的接口。还有甚者,如果组件B的queryInterface返回组件C的接口,组件C的queryInterface,也能够查到组件A的接口。
【我对这篇文章有话说?】
《COM技术内幕》FAQ[05-21]
关于COM中的复合文档[05-21]
Microsoft Windows CE 3.0中的CO..[05-21]
如何在VC6或者VC7下用 ATL做一个..[05-21]
COM指南 (Step by Step COM Tuto..[05-21]
COM指南 (Step by Step COM Tuto..[05-21]
COM指南 (Step by Step COM Tuto..[05-21]
COM指南 (Step by Step COM Tuto..[05-21]
[原创]理解I/O Completion Port[05-21]
C++ FAQ (翻译自 www.cplusplus..[05-21]
VC程序调试技巧备忘录[05-21]
NO MFC - 使用 .log 调试程序[05-21]
VB的ShowInTaskbar功能分析以及用..[05-21]
自己动手丰衣足食-搞定网页乱码[05-21]
CUJ:普及知识:typeint[05-21]
关于VC代码的编写和调试(三)[05-21]
通过串口收发短消息(上)[05-21]
A LITE VIRUS ABOUT PE INFECT[05-21]
让应用程序从IE中获取键入的网址[05-21]
Don Box:Smart Pointers : What..[05-21]