欢迎来到天天文库
浏览记录
ID:40523270
大小:38.00 KB
页数:6页
时间:2019-08-04
《COM原理及应用----COM对象和接口》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、COM原理及应用----COM对象和接口1、COM对象的理解 COM对象类似于C++语言中类的概念,类的每个实例代表一个COM对象,它也包括属性(即状态)和方法(即操作),状态反映对象的存在,方法就是接口。2、COM对象的标识-CLSID GUID是一个128位的随机数,重复概率极低。它的值来源于两部分:空间值(网卡地址或随机数)和时间值。 获得GUID值可以使用VC++提供的工具:GUIDGen.exe和UUIDGen.exe。或者使用COM库的API函数CoCreatGuid()。3、COM对象与C++对象的比较封装特性在COM对象中,数据是完全封装在对象内部,外部不可能直接访问对
2、象的数据属性。通过COM对象和客户程序提供的接口成员函数访问对象的属性。COM对象的数据成员的封装性是以组件为最终边界的,对于对象用户是完全透明的、不可见的;而C++对象的封装特性只是语义上的封装,对于对象用户是可见的。COM对象将数据完全封装在对象的内部。C++对象的封装是在语义上的封装,通过不同的数据类型实现数据的封装。可重用性COM对象的可重用性表现在COM对象的包容和聚合,一个对象可以完全使用另一个对象的所有功能;而C++对象的可重用性表现在C++类的继承性,派生类可以调用其父类的非私有成员函数。 COM对象的多态性通过其接口体现,C++对象的多态性通过其虚函数体现。4、COM
3、接口的作用和意义 COM规范的核心内容是关于接口的定义,虽然COM本身并不复杂,但是围绕COM接口有很多内容值得仔细探讨,包括接口的标识、接口函数的调用习惯、参数处理、接口与对象的关系以及接口与C/C++的关系、COM接口多具有的特性等。 COM定义了一套完整的接口规范,不仅可以弥补API作为组件接口的不足,还从分发挥了组件对象的优势,并实现了组件对象的多态性。5、接口定义和标识接口是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能。客户程序使用一个接口数据结构的指针来调用接口成员函数。接口指针实际上又指向另一个指针,这第二个指针指向一组函数指针(即一组函数地址
4、),成为接口函数表。接口函数表中每一项为4个字节的函数指针,每个函数指针与对象的具体实现联系起来。 从技术上讲,接口是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能。 客户程序用一个指向接口函数结构的指针来调用接口成员函数。实际上接口指针指向另一个指针pVtable。接口函数表称为虚函数表(VirtualFunctionTable,简称vtable),指向vtable的指针为pVtable。对于一个接口来说,它的虚函数表vtable是确定的。6、接口设计的问题 在接口成员函数中,字符串变量必须用Unicode字符指针,这是COM规范的要求。 COMAPI函
5、数使用大多数语言惯用的_stdcall调用习惯。 用C语言定义COM接口,需要有结构体struct定义其接口结构,接口成员函数必须有一个this指针。 用C++语言定义COM接口,因为由C++语言class的实现机理可以看出,COM接口结构中的vtable与class的vtable(类的虚函数表)完全一致,因此,用class描述COM接口是最方便的手段。此时,接口成员函数隐藏了this指针。 class型接口的说明要比struct型接口的说明简捷得多。7、COM接口与对象的联系 接口类只是一种描述,并不提供具体的实现过程。如果COM对象要实现接口,则COM对象必须以某种方式把它自身与
6、接口类联系起来,然后把接口类的指针暴露给客户程序,于是客户程序就可以调用对象的接口功能了。 用class型接口通过把接口指针(this)与对象数据绑定在一起的方法实现对COM接口的支持比较直观、简捷易于理解。实际上,也可以采用其他的方法来实现接口,只要接口成员函数中this指针(即接口指针)与对象数据能建立确定的连接,在接口成员函数中可以访问到对象数据即可。例如,VC++的MFC库和ATL(activetemplatelibrary,活动模板库)模板库分别采用了不同的机制来提供对COM接口的支持。8、接口描述语言IDL COM规范在采用OSF的DCE规范描述远程调用接口IDL(inter
7、facedescriptionlanguage,接口描述语言)的基础上,进行扩展形成了COM接口的描述语言。接口描述语言提供了一种不依赖于任何语言的接口描述方法,因此,它可以成为组件程序和客户程序之间的共同语言。COM规范使用的IDL接口描述语言不仅可用于定义COM接口,同时还定义了一些常用的数据类型,也可以描述自定义的数据结构,对于接口成员函数,我们可以制定每个参数的类型、输入输出特性,甚至支持可变长度的数
此文档下载收益归作者所有