首页 / 软件开发 / C++ / COM原理及应用----COM对象和接口
COM原理及应用----COM对象和接口2011-04-041、COM对象的理解COM对象类似于C++语言中类的概念,类的每个实例代表一个COM对象,它也包括属性(即状态)和方法(即操作),状态反映对象的存在,方法就是接口。2、COM对象的标识-CLSIDGUID是一个128位的随机数,重复概率极低。它的值来源于两部分:空间值(网卡地址或随机数)和时间值。获得GUID值可以使用VC++提供的工具:GUIDGen.exe 和 UUIDGen.exe。或者使用COM库的API函数CoCreatGuid()。3、COM对象与C++对象的比较COM对象将数据完全封装在对象的内部。C++对象的封装是在语义上的封装,通过不同的数据类型实现数据的封装。COM对象的可重用性通过包容和聚合实现。C++对象的可重用性通过类的继承来实现。COM对象的多态性通过其接口体现,C++对象的多态性通过其虚函数体现。4、COM接口的作用和意义COM规范的核心内容是关于接口的定义,虽然COM本身并不复杂,但是围绕COM接口有很多内容值得仔细探讨,包括接口的标识、接口函数的调用习惯、参数处理、接口与对象的关系以及接口与C/C++的关系、COM接口多具有的特性等。COM定义了一套完整的接口规范,不仅可以弥补API作为组件接口的不足,还从分发挥了组件对象的优势,并实现了组件对象的多态性。5、接口定义和标识从技术上讲,接口是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能。客户程序用一个指向接口函数结构的指针来调用接口成员函数。实际上接口指针指向另一个指针pVtable。接口函数表称为虚函数表(Virtual Function Table ,简称vtable),指向vtable的指针为pVtable。对于一个接口来说,它的虚函数表vtable是确定的。6、接口设计的问题在接口成员函数中,字符串变量必须用Unicode字符指针,这是COM规范的要求。COM API函数使用大多数语言惯用的_stdcall调用习惯。用C语言定义COM接口,需要有结构体struct定义其接口结构,接口成员函数必须有一个this指针。用C++语言定义COM接口,因为由C++语言class的实现机理可以看出,COM接口结构中的vtable与class的vtable(类的虚函数表)完全一致,因此,用class描述COM接口是最方便的手段。此时,接口成员函数隐藏了this指针。class 型接口的说明要比struct 型接口的说明简捷得多。