欢迎来到天天文库
浏览记录
ID:37844690
大小:312.50 KB
页数:15页
时间:2019-06-01
《COM原理及代码实例》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1.COM原理1.1.COM基本概念介绍1.什么是COM(ComponentObjectModal)COM(ComponentObjectModal)是Microsoft组件对象模型的简称。是一个说明如何建立可动态交替更新组件的规范。简单地说,COM是一种跨应用和语言共享二进制代码的方法。与C++不同,它提倡源代码重用。ATL便是一个很好的例证。源码级重用虽然好,但只能用于C++。它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。2.COM组件COM组件是由以Win32动态链接库(DLL)或可执行文件(EXE)发布的代码所组成。3.为什么要学习COM传统
2、的软件开发模式:传统的软件应用程序发布以后,使用者想得到更完善的软件或者去掉其中的某些内容,只有等软件提供商发布新的版本以后,使用者的这一梦想才能得以实现。使用COM组件以后:软件开发人员可以在软件版本发布以后修改或者去掉软件某个不需要部分。也及应用程序在更高的层次上定制,使得软件更具灵活性、动态性。是未来应用软件开发的趋势。4.COM的前身是OLE(ObjectLinkingandEmbedding)对象链接与嵌入。5.组件:如积木一样,具有“块”的概念,可以动态的将他们插入或卸出应用程序。这就需要两个条件:第一,组件必须动态链接(不因自己的位置改变而改变自身形式);第二,组
3、件必须隐藏内部实现细节(独立与具体编程语言,二进制形式发布)。每个组件相当于一个黑盒子,对外提供的只是接口(函数)。如果接口没有发生任何变化时,对组件的修改几乎不会影响应用程序的其它部分。提供服务的组件称为服务器组件,使用服务的组件称为客户组件。1.2.完整的COM组件的接口实现实例#include#includeusingnamespacestd;voidtrace(constchar*pMsg){cout<4、rtualvoid_stdcallFx2()=0;};//抽象接口2interfaceInteY{virtualvoid_stdcallFy1()=0;virtualvoid_stdcallFy2()=0;};//抽象接口实现classCompA:publicInteX,publicInteY{public://实现接口InteXvirtualvoid_stdcallFx1(){cout<<"CompA::Fx1"<5、tdcallFy1(){cout<<"CompA::Fy1"<Fx1();pintex->Fx2();InteY*pintey=pcompa;trace("客户:使用组件InteY接口。");pintey->Fy1();pintey->6、Fy2();trace("客户:删除组件。");deletepcompa;return0;}增加查询组件接口QueryInterface(),应用计数增加AddRef(),应用技术减少Release()的完整例子。#include#includeusingnamespacestd;voidtrace(constchar*pMsg){cout<7、/接口实现interfaceInteX:IUnknown{virtualvoid_stdcallFx()=0;};interfaceInteY:IUnknown{virtualvoid_stdcallFy()=0;};interfaceInteZ:IUnknown{virtualvoid_stdcallFz()=0;};//抽象接口实现classCompA:publicInteX,publicInteY{//IUnknown实现virtualHRESULTSTDMETHODCALLTYPEQ
4、rtualvoid_stdcallFx2()=0;};//抽象接口2interfaceInteY{virtualvoid_stdcallFy1()=0;virtualvoid_stdcallFy2()=0;};//抽象接口实现classCompA:publicInteX,publicInteY{public://实现接口InteXvirtualvoid_stdcallFx1(){cout<<"CompA::Fx1"<5、tdcallFy1(){cout<<"CompA::Fy1"<Fx1();pintex->Fx2();InteY*pintey=pcompa;trace("客户:使用组件InteY接口。");pintey->Fy1();pintey->6、Fy2();trace("客户:删除组件。");deletepcompa;return0;}增加查询组件接口QueryInterface(),应用计数增加AddRef(),应用技术减少Release()的完整例子。#include#includeusingnamespacestd;voidtrace(constchar*pMsg){cout<7、/接口实现interfaceInteX:IUnknown{virtualvoid_stdcallFx()=0;};interfaceInteY:IUnknown{virtualvoid_stdcallFy()=0;};interfaceInteZ:IUnknown{virtualvoid_stdcallFz()=0;};//抽象接口实现classCompA:publicInteX,publicInteY{//IUnknown实现virtualHRESULTSTDMETHODCALLTYPEQ
5、tdcallFy1(){cout<<"CompA::Fy1"<Fx1();pintex->Fx2();InteY*pintey=pcompa;trace("客户:使用组件InteY接口。");pintey->Fy1();pintey->
6、Fy2();trace("客户:删除组件。");deletepcompa;return0;}增加查询组件接口QueryInterface(),应用计数增加AddRef(),应用技术减少Release()的完整例子。#include#includeusingnamespacestd;voidtrace(constchar*pMsg){cout<7、/接口实现interfaceInteX:IUnknown{virtualvoid_stdcallFx()=0;};interfaceInteY:IUnknown{virtualvoid_stdcallFy()=0;};interfaceInteZ:IUnknown{virtualvoid_stdcallFz()=0;};//抽象接口实现classCompA:publicInteX,publicInteY{//IUnknown实现virtualHRESULTSTDMETHODCALLTYPEQ
7、/接口实现interfaceInteX:IUnknown{virtualvoid_stdcallFx()=0;};interfaceInteY:IUnknown{virtualvoid_stdcallFy()=0;};interfaceInteZ:IUnknown{virtualvoid_stdcallFz()=0;};//抽象接口实现classCompA:publicInteX,publicInteY{//IUnknown实现virtualHRESULTSTDMETHODCALLTYPEQ
此文档下载收益归作者所有