《类对象类厂》PPT课件.ppt

上传人:wuy****n92 文档编号:79030371 上传时间:2023-03-19 格式:PPT 页数:43 大小:1.24MB
返回 下载 相关 举报
《类对象类厂》PPT课件.ppt_第1页
第1页 / 共43页
《类对象类厂》PPT课件.ppt_第2页
第2页 / 共43页
点击查看更多>>
资源描述

《《类对象类厂》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《类对象类厂》PPT课件.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

2、说明之前加上关键字virtualvirtual在基类中的说明中,定义虚函数在基类中的说明中,定义虚函数 class CSharpclass CSharp virtual void Display();virtual void Display();调用:调用:CSharp*pSharp=GetCurSharp();CSharp*pSharp=GetCurSharp();pSharp-Display();pSharp-Display();纯虚函数纯虚函数定义:定义:class CSharpclass CSharp virtual void Display()=0;virtual void Disp

3、lay()=0;特点:特点:不能生成实例不能生成实例 派生类中必须提供相应虚函数的实现派生类中必须提供相应虚函数的实现This指针指针在类内部指向自身的指针在类内部指向自身的指针this指指针针隐隐含含地地用用来来引引用用对对象象的的数数据据成成员和成员函数。员和成员函数。x this-x;(*this).x;宏宏符号常数定义符号常数定义 格式:格式:#define 宏符号名宏符号名 常数常数/字符串字符串 例:例:#define STDMETHODIMP HRESULT STDMETHODCALLTYPE 带参数的宏带参数的宏#define STDMETHODIMP_(type)type S

4、TDMETHODCALLTYPE宏只是替换,保持变量的整体性宏只是替换,保持变量的整体性类型转换类型转换static_cast 模板函数模板函数是一个函数,由编译器根据模板自动产生是一个函数,由编译器根据模板自动产生 例子例子 template Type max(Type a,Type b)return(ab?a:b);使用函数模板:直接带参数调用使用函数模板:直接带参数调用max(3,5);max(3,5);max(3.5,5.5);max(3.5,5.5);编译器产生下面两个函数,然后再调用:编译器产生下面两个函数,然后再调用:int max(int a,int b)int max(int

5、 a,int b)return(ab?a:b);return(ab?a:b);double max(double a,double b)double max(double a,double b)return(ab?a:b);return(ab?a:b);类模板类模板类模板的一般形式:类模板的一般形式:template template class className class className /类声明体类声明体 ;template template 返回类型返回类型 className className :MemberFuncName1(MemberFuncName1(形式参数表形式参

6、数表)/成员函数定义体成员函数定义体 模板类模板类实实在在的类定义,类定义中的参数被实实实在在的类定义,类定义中的参数被实际类型所代替际类型所代替 例例 template class CArray:public Cobject使用使用 CArray Array;IUnknown接口接口IUnknownIUnknown是所有接口的基础是所有接口的基础每个每个COMCOM接口都必须从接口都必须从IUnknownIUnknown继承过来继承过来从从C+C+来看,来看,IUnknownIUnknown是一个纯虚基类是一个纯虚基类IUnknownIUnknown接口提供了两个非常重要的特性:生接口提供了

7、两个非常重要的特性:生存期控制和接口查询存期控制和接口查询IUnknownIUnknown 接口有三个函数接口有三个函数:HRESULT HRESULT QueryInterface(REFIID riid,void*ppvObject);(REFIID riid,void*ppvObject);ULONG ULONG AddRef();();ULONG ULONG Release();();自定义接口自定义接口自定义接口实质也是纯虚类自定义接口实质也是纯虚类自定义接口从自定义接口从IUnknownIUnknown派生派生COMCOM组件实际上是一个组件实际上是一个C+C+类类 ,从自定义接,

8、从自定义接口派生口派生COMCOM组件必须实现组件必须实现IUnknownIUnknown和自定义接口和自定义接口使用使用COM组件组件用用组组件件类类型型标标识识符符CLSIDCLSID和和接接口口标标识识符符IIDIID一一起起创创建建组组件件对对象象。如:如:IFirstInterfaceIFirstInterface*pFI pFI=NULL;=NULL;HRESULT hr=HRESULT hr=CoCreateInstanceCoCreateInstance(CLSID_(CLSID_FirstComponentFirstComponent,NULL,NULL,CLSCTX_INP

9、ROC_SERVER,CLSCTX_INPROC_SERVER,IID_ IID_IFirstInterfaceIFirstInterface,reinterpret_cast(&reinterpret_cast(&pFIpFI););需要检查调用,以确保成功,并且接下来使用该对象:需要检查调用,以确保成功,并且接下来使用该对象:if(SUCCEEDED(hr)if(SUCCEEDED(hr)pFIpFI-DoSomethingDoSomething();/();/调用方法程序调用方法程序 pFI pFI-Release();/-Release();/当处理完之后,必须释放接口当处理完之后,必

10、须释放接口 else /else /创建失败创建失败.思考题思考题CoCreateInstanceCoCreateInstance是什么函数?如何用?是什么函数?如何用?CoCreateInstanceCoCreateInstance是怎么找到是怎么找到CLSIDCLSID对应的组件的?对应的组件的?包含组件的程序模块在那里找?包含组件的程序模块在那里找?我的机器上要是有几个相同的组件程序模块,我的机器上要是有几个相同的组件程序模块,WindowsWindows会启动那一个?会启动那一个?创建的组件对象在那里?创建的组件对象在那里?组件程序和我的程序在相同的内存地址空间里吗?组件程序和我的程序

11、在相同的内存地址空间里吗?组件程序什么时候退出?组件程序什么时候退出?我的程序要是忽然死了,会出现什么样的状况?组件程我的程序要是忽然死了,会出现什么样的状况?组件程序还能正常退出吗?序还能正常退出吗?类对象类对象调用调用 CoCreateInstance 时发生了什么时发生了什么?CoCreateInstanceCoCreateInstance COM COM 搜索注册表搜索注册表找找CLSIDCLSID DLL DLL(或或 EXEEXE)CoCreateInstance CoCreateInstance 封装了下列功能:封装了下列功能:IClassFactoryIClassFactory

12、*pCFpCF;CoGetClassObjectCoGetClassObject(rclsidrclsid,dwClsContextdwClsContext,NULL,NULL,IID_IID_IClassFactoryIClassFactory,(void*)&,(void*)&pCFpCF););hresulthresult =pCFpCF-CreateInstanceCreateInstance(pUnkOuterpUnkOuter,riidriid,ppvObjppvObj);pCFpCF-Release();-Release();类对象(类对象(类厂类厂)定义:用于创建定义:用于创建

13、COM对象的对象的COM对象,主要目的对象,主要目的是实现是实现IClassFactory接口接口目标:完成目标:完成COM对象的创建过程,更好地把客户对象的创建过程,更好地把客户和对象隔离开来和对象隔离开来特殊性特殊性 (1 1)它不是通过调用)它不是通过调用 CoCreateInstance CoCreateInstance 或或 IClassFactory:CreateInstance IClassFactory:CreateInstance 创建创建 (2 2)它总是通过调用)它总是通过调用 CoGetClassObject CoGetClassObject 创建创建 (3 3)实现)

14、实现IClassFactoryIClassFactory接口(创建接口)接口(创建接口)(4 4)本身没有)本身没有CLSIDCLSID (5 5)只能创建同某个)只能创建同某个CLSIDCLSID相对应的组件对象相对应的组件对象 (6 6)由实现组件的开发人员实现)由实现组件的开发人员实现创建类对象创建类对象DllGetClassObject创建类对象创建类对象 创建类对象需要哪些信息?创建类对象需要哪些信息?DllGetClassObject原型:原型:DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID*ppv)ICLassFactor

15、y接口接口IClassFactory:public IUnknown public:virtual HRESULT STDMETHODCALLTYPE CreateInstance(IUnknown*pUnkOuter,REFIID riid,void*ppvObject)=0;virtual HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock)=0;ICLassFactory:LockServerICLassFactory:LockServer增加或减少增加或减少COM服务器所持有的锁数服务器所持有的锁数重要内容:重要内容:如果您保留一个类对象,则

16、必须调用如果您保留一个类对象,则必须调用 IClassFactory:LockServerIClassFactory:LockServer,以便告诉,以便告诉 COM COM 将服务程将服务程序保留在内存中。对类对象的引用不会自动将服务程序保留在内存中。对类对象的引用不会自动将服务程序保留在内存中。这个行为是序保留在内存中。这个行为是 COM COM 常规行为的例外。常规行为的例外。如果您不能锁定服务程序,在服务程序卸载之后,试如果您不能锁定服务程序,在服务程序卸载之后,试图访问类对象就有可能造成一个保护性错误。当您处图访问类对象就有可能造成一个保护性错误。当您处理完类对象之后,不要忘记解锁该

17、服务程序理完类对象之后,不要忘记解锁该服务程序小结:客户创建对象过程小结:客户创建对象过程客户提供信息客户提供信息 clsid iid 结果指针地址结果指针地址ppv过程:过程:由由clsid到注册表中找到组件的位置到注册表中找到组件的位置 LoadLibrary GetProcAddres,获取获取DllGetClassObject 用用clsid和和IID_IClassFactory类对象接口指针类对象接口指针pFac 用用iid和和ppv调用调用pFac-CreateInstance 为什么需要类对象?为什么需要类对象?可用同样的方法创建不同类型的组件对可用同样的方法创建不同类型的组件对

18、象:进程内、进程外、远程象:进程内、进程外、远程实现位置透明性实现位置透明性保持高效率,给客户程序灵活性保持高效率,给客户程序灵活性COM:进程内组件:进程内组件Inproc ServerCOM:进程外组件进程外组件Out-Of-Proc ServerCOM:远程组件远程组件Remote Server创建过程的位置透明性创建过程的位置透明性位置透明性可以极大地方便客户程序位置透明性可以极大地方便客户程序如何做到位置透明性?如何做到位置透明性?-如何从如何从clsid映射到组件位置?映射到组件位置?COM解决方案解决方案 -维护维护clsid与组件的映射关系与组件的映射关系 -在客户和组件插入中

19、介在客户和组件插入中介COM库库完成创建的细节工作完成创建的细节工作创建过程创建过程 -COM库位于库位于COM组件和客户中间组件和客户中间调用过程调用过程 -对于进程内组件,对于进程内组件,COM库不再参与处理库不再参与处理COM对象创建过程对象创建过程创建过程示意图创建过程示意图COM创建函数创建函数CoCreateInstanceCoCreateInstanceCoCreateInstanceExCoCreateInstanceExCoGetClassObjectCoGetClassObjectCoGetClassObjectHRESULT CoGetClassObject(REFCLS

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

21、Factory*pCF;HRESULT hr;HRESULT hr;hr=hr=CoGetClassObjectCoGetClassObject(rclsid,dwClsContext,NULL,(rclsid,dwClsContext,NULL,IID_IClassFactory,(void*)&pCF);IID_IClassFactory,(void*)&pCF);if(FAILED(hr)if(FAILED(hr)return hr;return hr;hr=pCF-CreateInstance(pUnkOuter,riid,ppvObj)hr=pCF-CreateInstance(pU

22、nkOuter,riid,ppvObj);pCF-Release();pCF-Release();CoGetClassObject的使用的使用IClassFactory*pCF;IClassFactory*pCF;CoGetClassObject(rclsid,dwClsContext,NULL,IID_IClassFactory,(voiCoGetClassObject(rclsid,dwClsContext,NULL,IID_IClassFactory,(void*)&pCF);d*)&pCF);PCF-LockServer(TRUE);/PCF-LockServer(TRUE);/将服务

23、程序锁定到内存中将服务程序锁定到内存中hresult=pCF-CreateInstance(pUnkOuter,riid,ppvObj)hresult=pCF-CreateInstance(pUnkOuter,riid,ppvObj)/使用使用ppvObjppvObjppvObj-Release();ppvObj-Release();hresult=pCF-CreateInstance(pUnkOuter,riid,ppvObj1)hresult=pCF-CreateInstance(pUnkOuter,riid,ppvObj1)/使用使用ppvObj1ppvObj1ppvObj1-Relea

24、se();ppvObj1-Release();PCF-LockServer(FALSE);PCF-LockServer(FALSE);pCF-Release();pCF-Release();CoGetClassObject适用情况适用情况用不同于用不同于IClassFactory的某个创建接口的某个创建接口来创建组件,例如来创建组件,例如IClassFactory2创建同一组件的多个实例创建同一组件的多个实例CoGetClassObject 如何获得类对象取决于具体实现取决于具体实现DLL 加载加载dll,调用调用DllGetClassObject取类取类对象对象EXE 加载加载dll,EXE

25、自己生成对象和向自己生成对象和向COM系系统注册,取类对象统注册,取类对象第一章思考题1 1 什么是组件?组件编程有什么优缺点?什么是组件?组件编程有什么优缺点?2 2 什么是什么是COMCOM(组件对象模型)?(组件对象模型)?3 3 什么是标识码,本章提到了哪些标识码,什么是标识码,本章提到了哪些标识码,它们分别标识了什么?它们分别标识了什么?4 4 用户能直接调用组件内部的方法吗?用户能直接调用组件内部的方法吗?5 5 什么是接口?起什么作用?什么是接口?起什么作用?6 6 下列接口中,下列接口中,COMCOM组件必须实现的是:组件必须实现的是:a.IDispatch a.IDispat

26、ch b.IUnknown b.IUnknown c.IInterface c.IInterface d.ISomethingd.ISomething第一章思考题(续)7 IUnknown接口包含的方法是:a.CreatInstance b.AddRef c.Release d.QueryInterface8 组件、接口、方法是一种什么样的关系?9 程序模块与组件是什么关系?10下列表述不正确的是:a.COM组件符合二进制标准。b.若贷款计算器组件用VC编写,这样组件在VB环境下照样可以使用。c.COM是一种计算机语言。d.组件在网络上的位置是透明的。11组件编程中用C语言创建对象实例的两个方法 是哪两个?Question&AnswerThank you

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁