高级软件工程(COM基础:接口与实现)

上传人:206****923 文档编号:51719174 上传时间:2018-08-16 格式:PPT 页数:54 大小:154KB
返回 下载 相关 举报
高级软件工程(COM基础:接口与实现)_第1页
第1页 / 共54页
高级软件工程(COM基础:接口与实现)_第2页
第2页 / 共54页
高级软件工程(COM基础:接口与实现)_第3页
第3页 / 共54页
高级软件工程(COM基础:接口与实现)_第4页
第4页 / 共54页
高级软件工程(COM基础:接口与实现)_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《高级软件工程(COM基础:接口与实现)》由会员分享,可在线阅读,更多相关《高级软件工程(COM基础:接口与实现)(54页珍藏版)》请在金锄头文库上搜索。

1、构件对象模型:COM 1内内 容容基础部分 综述 接口 实现 高级部分 包含与聚合 COM与VC 自动化 DCOM 2(1) COM的起源源于OLE: Object Link and EmbeddingOLE1 采用DDE(Dynamic Data Exchange) 在不同的程序之间进行通信 DDE缺点: 效率低,稳定性不好,使用不方便COM是为克服上述不足而出现的OLE2 以 COM 为基础但OLE未能体现COM优点1 综述COMCOM基础基础3(2)什么是COM 构件对象模型:Component Object Model客户与构件为了能够互操作而遵循的标准COM标准包括规范与实现两部分规

2、范部分定义了构件之间的通信机制 这些规范不依赖于任何特定的语言 和操作系统 实现部分即COM库 为COM规范的具体实现提供一些核心服务COMCOM基础基础4(3) COM构件以 DLL或EXE形式发布的代码与语言无关 以二进制形式发布 可以在不妨碍客户的形式下被升级 可以透明地在网络上被重新分配构件与类:一个构件可以由多个类实现接口与类:一个类可以实现多个接口COMCOM基础基础5(4) COM库 (COM Library)功能: (1)实现客户方与服务器方COM应用的创建过程 (2)COM通过注册表查找本地服务器(即EXE程序)以及程序名与CLSID的转换 (3)提供标准的内存控制方法DCO

3、M的实现提供了分布式环境下的通信机制在操作系统层次 以DLL文件的形式存在COMCOM基础基础6(5) COM特性 语言无关性 为跨语言合作开发提供了统一标准 并得到不同集成开发环境的支持 进程透明性 进程内服务程序: DLL 本地服务程序: EXE 远地服务程序: DLL或EXE 实现进程透明性的关键是COM库 它负责服务体的定位管理对象的创建及对象与客户之间的通信 复用性 包含方式聚合方式COMCOM基础基础7(6) COM发展趋势操作系统 成为系统的基本软件模型 数据库OLE DB/ADO 以 COM 的方式 为数据访问提供一致的接口 InternetActiveX包含了所有基于COM的

4、Internet相关技术 COM+ 增加MTS等服务COMCOM基础基础82 COM接口COM接口是COM规范的核心内容接口的意义(略)一个接口包含了一组函数在C+中, 可以用抽象基类来定义COM接口接口的实现 : vtbl 指针 虚拟函数表COMCOM基础基础9Vtbl指针虚拟函数表 pIX接口的内存结构IXvirtual ULONG AddRef() = 0; virtual ULONG Release() = 0; IUnknownIUnknownCOMCOM基础基础14Vtbl指针虚拟函数表IXQueryInterface AddRef Release创建构件时,客户可以使用Creat

5、eInstance,而不是new。CreateInstance的定义:IUnknown * CreateInstance() IUnknown * pI = static_cast (new foo);pI - AddRef();return pI; COMCOM基础基础16(2 2)引用计数)引用计数AddRef与Release控制构件的生命期 解决内存管理问题 使构件能够自己将自己删除使用规则 返回接口指针之前调用 AddRef; 使用完接口之后调用Release; 赋值之后调用AddRef;COMCOM基础基础17引用计数的实现方式: 在什么层次上进行计数 构件 对象 接口构件构件引用记

6、数对象引用记数对象引用记数对象1对象2接口接口接口接口接口引用记数接口引用记数接口引用记数接口引用记数COMCOM基础基础18(3 3)接口查询)接口查询一个COM对象(构件)可以实现多个接口 使用QueryInterface查询某个构件是否支持某个特定的接口 QueryInterfaceQueryInterface的的使用使用void foo(Iunknown * pI) /Define a pointer for the interface. IX * pIX = NULL;/Ask for nterface IX HRESULT hr = pI-QueryUbterface(IID_IX

7、, (void *)/Check return value. If (SUCCEEDED(hr) / Use interface pIX-Fx(); COMCOM基础基础19 QueryInterfaceQueryInterface的实现的实现假定存在类 CA,继承接口 IX 与 IY:HRESULT _sfdcall CA: QueryInterface(const IID else if (iid = IID_IX) *ppv = static_cast(this); else if (iid = IID_IY) *ppv = static_cast(this); else *ppv =

8、NULL;return E_NOINTERFACE; static_cast(*ppv)-AddRef(); return S_OK; COMCOM基础基础20 QueryInterfaceQueryInterface的实现规则的实现规则QueryInterface返回的总是同一个IUnknown指针 若客户曾经获取过某个接口,那么它将总能获取此接口客户可以再次获取已经拥有的接口 客户可以返回到起始接口 若能够从某个接口获取某特定接口 则可以从(该构件的)任意接口获取此接口COMCOM基础基础21新版本构件的处理新版本构件的处理COM接口永远不会变化 :一个IID就是一个接口 通过发行新版本构

9、件解决兼容性 当下列条件中的任何一个变化时 应给新接口指定新IID: 接口中函数数目 接口中函数顺序 某个函数的参数 某个函数参数的顺序 某个函数参数的类型 函数可能的返回值 函数返回值的类型等 不同版本接口的命名:在老名称后加一个数字COMCOM基础基础223 COM3 COM实现实现(1)预备知识: DLL DLL是一个构件服务器 EXE也可以是构件服务器 使用户在应用程序的运行过程中替换构件 构件是DLL中实现的接口集 DLL共享它们所链入的应用程序地址空间HRESULT 向用户报告构件运行结果状况 “Here is the RESULT” WINERROR.H中进行定义 用户可以定义自

10、己的代码COMCOM基础基础23GUID: Globally Unique IDentifier用于标识构件(CLSID)与接口(IID) 128位(长整数)由于空间足够大 接口标识冲突较小 可以用编程的方法生成具有唯一性的GUID VC: UUIDGEN.EXE, GUIDGEN.EXE 借鉴了OSF的UUID(DCE中的RPC使用). 对GUID值的传递通常通过引用进行COMCOM基础基础CLSID:CLaSs IDentifier24Windows 注册表Windows操作系统的共享系统数据库 包括 硬件 软件 配置及用户等各种信息 由REGEDIT.EXE (95/98) REGEDI

11、T32.EXE(NT) 启动 可以使用REGSVR32.EXE来注册某个构件注册表是一个由许多元素构成的层次结构 每一个元素均被称作是一个关键字 每一个关键字可以包含一系列子关键字等例如:HKEY_CLASSES_ROOT CLSID ProgID 等COMCOM基础基础25COMCOM基础基础26COMCOM基础基础27(2)COM库COM构件与客户皆需要完成的相同操作 由OLE32.DLL、OLE32.LIB实现COM库中常用的函数:初始化函数 与GUID相关的函数 对象创建函数 内存管理函数COMCOM基础基础28在使用COM库中的其他函数(除CoBuildVersion) 之前,进程必

12、须先调用: HRESULT CoInitialize(void * reserved)在退出之前调用: void CoUninitialize(void * reserved)其他:CoBuildVersion CoFreeUnusedLibrariesOleInitialize建立在CoInitialize基础之上DCOM使用CoInitializeEx初始化函数:COMCOM基础基础29与GUID(CLSID)相关的函数:例如:将GUID转换为一个字符串: wchar_t szCLSID39; int r = : StringFromGUID2(CLSID_Component1,szCLS

13、ID, 39);其它: StringFromCLSID StringFromIID CLSIDFromString IIDFromString IsEqualGUID IsEqualIID IsEqualCLSID CLSIDFromProgIDCOMCOM基础基础30对象创建函数:CoGetClassObject CoCreateInstance CoCreateInstanceEx CoRegisterClassObject CoRevokeClassObject CoDisconnectObject内存管理函数:CoTaskMemAlloc CoTaskMemRealloc CoTask

14、MemFree CoGerMallocCOMCOM基础基础31(3 3) 类厂类厂( (Class Factory)Class Factory)能够创建其他构件的构件 (构件厂) 其本身也是一个COM对象 支持一个特殊的接口 IClassFacroty 每一个COM对象类应该有一个相应的类厂对象COMCOM基础基础32CoCreateInstance COM库函数之一HRESULT_stdcall CoCreateInstance( const CLSID clsid:待创建构件的标识; pIUnknownOuter:用于聚合; dwClsContext:限定所创建构件的上下文; iid:构件

15、上待使用接口的标识; ppv:所返回接口的指针。COMCOM基础基础33一个使用例子:IX * pIX = NULL; HRESULT he = :CoCreateInstance( CLSID_Component1, NULL, CLSCTX_INPROC_SERVER, IID_IDX, (void *) if (SUCCEEDED(hr) pIX - FX(); pIX - Release(); COMCOM基础基础34类厂CoCreateInstance实际上 未直接创建COM构件 创建了一个被称为类厂的构件类厂构件的唯一功能是创建其他构件 客户可以通过类厂所支持的接口来 对类厂创建构

16、件的过程加以控制CoCreateInstance调用CoGetClassObject创建构件的标准接口是IClassFactoryCOMCOM基础基础35CoGetClassObject 创建类厂HRESULT_stdcall CoGetClassObject( const CLSIDCOMCOM基础基础36IClassFactory用于创建构件的标准接口Interface IClassFactory: IUnknown HRESULT _stdcall CreateInstance( IUnknown * pUnknownOuter, const IID HRESULT _stdcall LockServer(BOOL block); 未接收CLSID:只能创建同某个CLSID相应的构件IClassFactory2COMCOM基础基础37CoCreateInstance 与 CoGetClassObject的关系: CoCre

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

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号