欢迎来到天天文库
浏览记录
ID:37571172
大小:349.32 KB
页数:54页
时间:2019-05-12
《高级软件工程(COM基础:接口与实现)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、构件对象模型:COM1内容基础部分综述接口实现高级部分包含与聚合COM与VC自动化DCOM2(1)COM的起源源于OLE:ObjectLinkandEmbeddingOLE1采用DDE(DynamicDataExchange)在不同的程序之间进行通信DDE缺点:效率低,稳定性不好,使用不方便COM是为克服上述不足而出现的OLE2以COM为基础但OLE未能体现COM优点1综述COM基础3(2)什么是COM构件对象模型:ComponentObjectModel客户与构件为了能够互操作而遵循的标准COM标准包括规范与实现两部分规范部分定义了构件之间的通信机制这些规范不依赖于任何特定的语言和操作系
2、统实现部分即COM库为COM规范的具体实现提供一些核心服务COM基础4(3)COM构件以DLL或EXE形式发布的代码与语言无关以二进制形式发布可以在不妨碍客户的形式下被升级可以透明地在网络上被重新分配构件与类:一个构件可以由多个类实现接口与类:一个类可以实现多个接口COM基础5(4)COM库(COMLibrary)功能:(1)实现客户方与服务器方COM应用的创建过程(2)COM通过注册表查找本地服务器(即EXE程序)以及程序名与CLSID的转换(3)提供标准的内存控制方法DCOM的实现提供了分布式环境下的通信机制在操作系统层次以DLL文件的形式存在COM基础6(5)COM特性语言无关性为跨
3、语言合作开发提供了统一标准并得到不同集成开发环境的支持进程透明性进程内服务程序:DLL本地服务程序:EXE远地服务程序:DLL或EXE实现进程透明性的关键是COM库它负责服务体的定位管理对象的创建及对象与客户之间的通信复用性包含方式聚合方式COM基础7(6)COM发展趋势操作系统成为系统的基本软件模型数据库OLEDB/ADO以COM的方式为数据访问提供一致的接口InternetActiveX包含了所有基于COM的Internet相关技术COM+增加MTS等服务COM基础82COM接口COM接口是COM规范的核心内容接口的意义(略)一个接口包含了一组函数在C++中,可以用抽象基类来定义COM
4、接口接口的实现:vtbl指针虚拟函数表COM基础9Vtbl指针虚拟函数表pIX接口的内存结构IX&Fx1&Fx2&Fx3&Fx4COM基础10Vtbl的作用:提高接口实现的灵活性例子:一个实现接口IX的类CA,CA包含2个数据:Vtbl指针虚拟函数表IX&Fx1&Fx2&Fx3&Fx4Data1Data2pAFx1Fx2Fx3Fx4CACOM基础11两个实例共享同一Vtbl:Vtbl指针虚拟函数表&Fx1&Fx2&Fx3&Fx4Data1Data2pA1pA2Fx1Fx2Fx3Fx4CAVtbl指针Data1Data2COM基础12接口特点实现级二进制,独立于编程语言稳定性客户与服务器依赖
5、于接口继承性便于扩展接口,不提倡继承所有接口皆继承Iunknown)多态性:COM基础13(1)功能提供:生存期控制接口查询IUnknown的定义(IDL):interfaceIUnkown{virtualHRESULTQueryInterface(constIID&,void**ppv)=0;virtualULONGAddRef()=0;virtualULONGRelease()=0;}IUnknownCOM基础14Vtbl指针虚拟函数表IXQueryInterfaceAddRefRelease&FxpAQueryInterfaceAddRefReleaseFxCA所有接口都必须继承IU
6、nknownCOM基础15IUnknown指针的获取IUnknown*CreateInstance();创建构件时,客户可以使用CreateInstance,而不是new。CreateInstance的定义:IUnknown*CreateInstance(){IUnknown*pI=static_cast(newfoo);pI->AddRef();returnpI;}COM基础16(2)引用计数AddRef与Release控制构件的生命期解决内存管理问题使构件能够自己将自己删除使用规则返回接口指针之前调用AddRef;使用完接口之后调用Release;赋值之后调用AddRef;C
7、OM基础17引用计数的实现方式:在什么层次上进行计数构件对象接口构件构件引用记数对象引用记数对象引用记数对象1对象2接口接口接口接口接口引用记数接口引用记数接口引用记数接口引用记数COM基础18(3)接口查询一个COM对象(构件)可以实现多个接口使用QueryInterface查询某个构件是否支持某个特定的接口QueryInterface的使用voidfoo(Iunknown*pI){//Defineapointerfo
此文档下载收益归作者所有