欢迎来到天天文库
浏览记录
ID:41565795
大小:58.99 KB
页数:6页
时间:2019-08-27
《一个基础的COM实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、一个基础的COM实现目录一、术语定义二、接口模型三、对象模型1、部件的规格2、部件实例的创建与部件的标识四、部件的定义和实现1、基础部件2、Getlnterface机制3、Createlnstance&Destroylnstance机制五、模型使用规范及示例1、定义接口2、定义及实现部件3、部件的引用4、部件的跨动态联接库使用一、术语定义接口:一组函数(方法和属性)的组合。可用C++的纯虚类表示。部件:实现若干接口的部件,相当于传统面向对象屮类的概念。类:用来定义和实现部件的c卄类。实例:部件所创建的单个实体,相当于传统面向对象中对象的概
2、念。二、接口模型接口模型的主要内容定义于vPosyinterface.h>中。接口模型包括,接口标识INN、基础接口IBase当前定义如下:typedefunsignedlongINN;//forInterfaceIDs#define1NTFclass//forInterfaceDefinitionstaticconstINNIN_IBase=0;INTFIBase{public:GetInterface(INNinlD,void**pplntf)=0;GetObject(void**ppObj)=0;Destroylnstance()=
3、0;virtualBOOLvirtualBOOLvirtualBOOL};IBase标识号为0。包含三个函数:Getlnterface用于获取指定ID的接口;GetObject用于获取实现该接口的部件实例;DestroyObject用于销毁实现该接口的部件实例。所有接口都必须继承IBase接II,并实现其成员函数。还需定义一个唯一的接口标识一般命名为IN」nterfaceNameo三、对象模型对喙模型的主要内容定义于vPosyObject.h>中。1、部件的规格每一个部件必须至少实现IBase接口。并实现规定的特征。一个标准的部件原型如卜
4、classCPosyObject{protected:CPosyObjcct(){};virtual-CPosyObject(){};public:staticBOOLCreatelnstance(void**ppObj);staticBOOLCreatelnstance(INNinlD,void**pplntf);部件的构造函数与析构函数不为Public,以禁止部件实例被直接创建。部件具有两个Createlnstance静态函数,川于创建部件实例。其屮一个可直接获取指向部件实例的指针,另一个可获取指定接口的接口指针。但一般并不允许肓接
5、调用这两个函数。2、部件实例的创建与部件的标识部件的客户至少可以分为两利U-种具有定义部件的类的访问权,这种客户可以直接调用部件的Createlnstance成员隊[数來创建实例;另一种无法収得部件的定义(即不包含定义class的头文件),这时必须通过部件标识來创建部件实例。标准的部件使用者一般通过对彖模烈的基础服务ObjSew的静态成员函数Createlnstance来创建实例。该函数需给出部件标识,然后返回指定接口的指针。部件标识即为部件的第二个Createlnstance静态成员函数的地址。部件标识的定义为:typedefBOOL(
6、*OBN)(INN,void**);命名一般为ON_ObjcctNamc。使用如下:OBNON_PosyObject=&(CposyObject::CreateInstance);•••IBase*pIBase=NULL;If(ObjServ::CreateInstance(ON_PosyObject,IN」Base,(void**)&pIBase)){•••pIBase->DestroyInstance();这种方法可以在不暴露部件类具体实现的悄况下提供创建部件实例的能力。四、部件的定义和实现部件定义与实现的辅助服务主要定义于
7、Object.h>H'o这种辅助服务是可选的。1、基础部件部件定义与实现主要借助基础部件BaseObject和一套辅助宏來实现。基于这套辅助服务的部件一般直接或间接继承于BaseObject,并同时继承所需实现的接口。BaseObject定义如卜:classCBascObjcct:publicIBasc{protected:CBaseObject(){};virtual〜CBaseObject(){};virtualvoid*_InternalGetInterface(INNinlD)if(inlD==INJBase){return(IB
8、ase*)this;}returnNULL;public:virtualBOOLGetInterface(INNinlD,void**pplntf)=0;virtualBOOLGetObjec
此文档下载收益归作者所有