类对象类厂.ppt

上传人:本田雅阁 文档编号:2611217 上传时间:2019-04-17 格式:PPT 页数:43 大小:1.82MB
返回 下载 相关 举报
类对象类厂.ppt_第1页
第1页 / 共43页
类对象类厂.ppt_第2页
第2页 / 共43页
类对象类厂.ppt_第3页
第3页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《类对象类厂.ppt》由会员分享,可在线阅读,更多相关《类对象类厂.ppt(43页珍藏版)》请在三一文库上搜索。

1、类对象(类厂),杨之江 ,内容,复习 类对象 Q&A,复习,复习,IUnknown接口 自定义接口 使用COM组件 思考题,C+回顾,面向对象基本特征:封装、继承、多态 封装 属性和功能集成,对外隐藏实现细节 对外接口:成员函数 和/或成员变量 继承 类继承 实现继承 多态 不同情形中用同一接口完成不同功能,类层次图,虚函数,实现了多态性 说明:在函数说明之前加上关键字virtual 在基类中的说明中,定义虚函数 class CSharp virtual void Display(); 调用: CSharp *pSharp=GetCurSharp(); pSharp- Display();,纯

2、虚函数,定义: class CSharp virtual void Display()=0; 特点: 不能生成实例 派生类中必须提供相应虚函数的实现,This指针,在类内部指向自身的指针 this指针隐含地用来引用对象的数据成员和成员函数。 x this-x; (*this).x;,宏,符号常数定义 格式:#define 宏符号名 常数/字符串 例:#define STDMETHODIMP HRESULT STDMETHODCALLTYPE 带参数的宏 #define STDMETHODIMP_(type) type STDMETHODCALLTYPE 宏只是替换,保持变量的整体性,类型转换,

3、static_cast,模板函数,是一个函数,由编译器根据模板自动产生 例子 template Type max(Type a, Type b) return(ab?a:b); 使用函数模板:直接带参数调用 max(3,5); max(3.5,5.5); 编译器产生下面两个函数,然后再调用: int max(int a,int b) return(ab?a:b); double max(double a,double b) return(ab?a:b);,类模板,类模板的一般形式: template class className /类声明体 ; template 返回类型 className

4、:MemberFuncName1(形式参数表) /成员函数定义体 ,模板类,实实在在的类定义,类定义中的参数被实际类型所代替 例 template class CArray : public Cobject 使用 CArray Array;,IUnknown接口,IUnknown是所有接口的基础 每个COM接口都必须从IUnknown继承过来 从C+来看, IUnknown是一个纯虚基类 IUnknown接口提供了两个非常重要的特性:生存期控制和接口查询 IUnknown 接口有三个函数: HRESULT QueryInterface(REFIID riid,void *ppvObject);

5、 ULONG AddRef(); ULONG Release();,自定义接口,自定义接口实质也是纯虚类 自定义接口从IUnknown派生 COM组件实际上是一个C+类 ,从自定义接口派生 COM组件必须实现IUnknown和自定义接口,使用COM组件,用组件类型标识符CLSID和接口标识符IID一起创建组件对象。如: IFirstInterface* pFI=NULL; HRESULT hr=CoCreateInstance( CLSID_FirstComponent,NULL, CLSCTX_INPROC_SERVER, IID_IFirstInterface, reinterpret_c

6、ast( / 当处理完之后,必须释放接口 else / 创建失败.,思考题,CoCreateInstance是什么函数?如何用? CoCreateInstance是怎么找到CLSID对应的组件的? 包含组件的程序模块在那里找? 我的机器上要是有几个相同的组件程序模块,Windows会启动那一个? 创建的组件对象在那里? 组件程序和我的程序在相同的内存地址空间里吗? 组件程序什么时候退出? 我的程序要是忽然死了,会出现什么样的状况?组件程序还能正常退出吗?,类对象,调用 CoCreateInstance 时发生了什么?,CoCreateInstance COM 搜索注册表找CLSID DLL(或

7、 EXE) CoCreateInstance 封装了下列功能: IClassFactory *pCF; CoGetClassObject(rclsid, dwClsContext, NULL, IID_IClassFactory, (void *),类对象(类厂),定义:用于创建COM对象的COM对象,主要目的是实现IClassFactory接口 目标:完成COM对象的创建过程,更好地把客户和对象隔离开来 特殊性 (1)它不是通过调用 CoCreateInstance 或 IClassFactory:CreateInstance 创建 (2)它总是通过调用 CoGetClassObject 创

8、建 (3)实现IClassFactory接口(创建接口) (4)本身没有CLSID (5)只能创建同某个CLSID相对应的组件对象 (6)由实现组件的开发人员实现,创建类对象,DllGetClassObject创建类对象 创建类对象需要哪些信息? DllGetClassObject原型: DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID* ppv),ICLassFactory接口,IClassFactory : public IUnknown public: virtual HRESULT STDMETHODCALLTYPE Cre

9、ateInstance( IUnknown *pUnkOuter, REFIID riid, void *ppvObject) = 0; virtual HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock) = 0; ;,ICLassFactory:LockServer,增加或减少COM服务器所持有的锁数 重要内容: 如果您保留一个类对象,则必须调用 IClassFactory:LockServer,以便告诉 COM 将服务程序保留在内存中。对类对象的引用不会自动将服务程序保留在内存中。这个行为是 COM 常规行为的例外。如果您不能锁定服务程序,在服

10、务程序卸载之后,试图访问类对象就有可能造成一个保护性错误。当您处理完类对象之后,不要忘记解锁该服务程序,小结:客户创建对象过程,客户提供信息 clsid iid 结果指针地址ppv 过程: 由clsid到注册表中找到组件的位置 LoadLibrary GetProcAddres,获取DllGetClassObject 用clsid和IID_IClassFactory类对象接口指针pFac 用iid和ppv调用pFac-CreateInstance,为什么需要类对象?,可用同样的方法创建不同类型的组件对象:进程内、进程外、远程 实现位置透明性 保持高效率,给客户程序灵活性,COM:进程内组件,I

11、nproc Server,COM:进程外组件,Out-Of-Proc Server,COM:远程组件,Remote Server,创建过程的位置透明性,位置透明性可以极大地方便客户程序 如何做到位置透明性? -如何从clsid映射到组件位置? COM解决方案 -维护clsid与组件的映射关系 -在客户和组件插入中介,COM库,完成创建的细节工作 创建过程 -COM库位于COM组件和客户中间 调用过程 -对于进程内组件,COM库不再参与处理,COM对象创建过程,创建过程示意图,COM创建函数,CoCreateInstance CoCreateInstanceEx CoGetClassObject

12、,CoGetClassObject,HRESULT CoGetClassObject( REFCLSID rclsid, /组件的CLSID DWORD dwClsContext, /指定组件将要 运行上下文 LPVOID pvReserved, / DCOM保留 REFIID riid, /所要的接口ID (void*) ppv); /返回该接口的指针,CoCreateInstance实现伪码,HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter,DWORD dwClsContext, REFIID riid,LPVOID

13、 * ppv ) IClassFactory *pCF; HRESULT hr; hr= CoGetClassObject(rclsid,dwClsContext,NULL, IID_IClassFactory, (void *) ,CoGetClassObject的使用,IClassFactory *pCF; CoGetClassObject(rclsid,dwClsContext,NULL,IID_IClassFactory,(void *),CoGetClassObject适用情况,用不同于IClassFactory的某个创建接口来创建组件,例如IClassFactory2 创建同一组件

14、的多个实例,CoGetClassObject 如何获得类对象,取决于具体实现 DLL 加载dll,调用DllGetClassObject取类对象 EXE 加载dll,EXE自己生成对象和向COM系统注册,取类对象,第一章思考题,1 什么是组件?组件编程有什么优缺点? 2 什么是COM(组件对象模型)? 3 什么是标识码,本章提到了哪些标识码, 它们分别标识了什么? 4 用户能直接调用组件内部的方法吗? 5 什么是接口?起什么作用? 6 下列接口中,COM组件必须实现的是: a. IDispatch b. IUnknown c. IInterface d. ISomething,第一章思考题(续),7 IUnknown接口包含的方法是: a. CreatInstance b. AddRef c. Release d. QueryInterface 8 组件、接口、方法是一种什么样的关系? 9 程序模块与组件是什么关系? 10下列表述不正确的是: a. COM组件符合二进制标准。 b. 若贷款计算器组件用VC编写,这样组件在VB环境下照样可以使用。 c. COM是一种计算机语言。 d. 组件在网络上的位置是透明的。 11组件编程中用C语言创建对象实例的两个方法 是哪两个?,Question & Answer,Thank you,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1