2.第二讲 COM基本原理

上传人:野鹰 文档编号:26798126 上传时间:2018-01-01 格式:PPT 页数:34 大小:7.79MB
返回 下载 相关 举报
2.第二讲 COM基本原理_第1页
第1页 / 共34页
2.第二讲 COM基本原理_第2页
第2页 / 共34页
2.第二讲 COM基本原理_第3页
第3页 / 共34页
2.第二讲 COM基本原理_第4页
第4页 / 共34页
2.第二讲 COM基本原理_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《2.第二讲 COM基本原理》由会员分享,可在线阅读,更多相关《2.第二讲 COM基本原理(34页珍藏版)》请在金锄头文库上搜索。

1、COM基本原理,1,COM基本原理,本部分重点掌握:(1) 组件及其相关概念;(2) COM组件标准;(3) 如何制作组件;(4) 如何注册和注销组件;(5) 如何使用组件;(6) COM库和组件的运行环境。(7) 组件生存期如何维护;(8) 标准接口IUnknown和IDispatch; (9) 组件与IUnknown的关系;(10) 控件与IDispatch的关系,控件的属性、方法、事件;,2,3,1.2、组件重用技术 明码:源程序(C+类)、宏、模板(1)软件重用技术 静态连接库lib 二进制代码 动态连接库dll 组件,(2) 组件(Component)?,编译连接好可使用的二进制程序

2、代码。,4,2.1、COM对象,COM 对象封装程度高无法知道对象的内部实现细节:语言、数据结构、程序代码。只能通过接口访问(access)对象。,5,神秘的COM先生,听说你很能干,请问你叫什么名字? 我的名字叫:2E06E8F1-5B39-4a7d-8B56-B95F553385B4我怎么没见过这样的名字?这么长,好难记呀! 这是我们在大微软帝国的身份证号,是盖茨老佛爷起的,有128位呢,他说这是全球唯一标识符(或者叫GUID)。 你也可以叫我的学名,不过你得严格的这样叫: CLSID_MrCOM 你要是觉得合适的话,还可以叫我的小名: Word.Document.1 是不是容易记多了?我

3、想向你请教几个问题?怎么和你联系呀? 给我的秘书打电话把,号码是: 00000000-0000-0000-C000-000000000046哇!还是这么长,不过好像很特别!,2.2、COM迷与COM先生的对话,6,2.2、COM迷与COM先生的对话(续),是的,在大微软帝国,所有的号码都叫全球唯一标识码。我有很多种联系方式,你可以写信、发电报、发传真,还有现在说不清的联系方式。那你都告诉我吧?这样我就好和你联系了。 不行呀,因为我经常到世界各地去解答人们的问题,其它联系方式都是变的,只有秘书的电话不变,她知道我最近的联系方式,你每次都先向她查询我的联系方式,然后再问我。好麻烦哟!她的电话号码那

4、么长,每次都要数0。 哈哈,现在已经很先进了,可以声音拨号啦,你叫她“IUnknown”就行了,中文名叫“艾安娜”。那她能做些什么呢? 她只做三件事:告诉你我的其它联系方式;记录你和我联系次数,也就是“加数”和“减数”。她很单纯,你不要多问。好的,我知道以后怎么做了。,7,2.3、COM对象的标识、接口、方法CLSID、IID,8,2.4、COM接口规则,使用组件的唯一途径由方法、属性组成有全球唯一标识码(I)接口规则是COM规范的一部分,接口协议不可变具有多态性,9,在COM中接口是核心、是焦点。对于客户来说,一个组件就是一个接口集。客户只能通过接口才能同COM组件打交道。,接口是使用组件的

5、唯一途径,10,接口是一组可以调用的方法(函数)。 在 C+ 中,接口是用抽象基类代表的。例如,Ifoo接口的定义可能是: class Ifoo virtual void Func1(void) = 0; virtual void Func2(int nCount) = 0; ;,接口由方法、属性组成(接口的本质),11,在 COM 中,一旦公布组件的接口,就不能再改变,包括: (1)函数个数、顺序、功能、返回值 (2)参数个数、类型、顺序 组件中,老接口不适应新的需求时,只能采用以下两种方法: (1)给组件增加一个新接口。 (2)重新编写与原组件不同的新组件。给同一个组件添加与旧接口几乎一样

6、的新接口,可以不需要重新编写全部的实现代码,因为COM支持接口的继承。可以如下定义IFoo2: class IFoo2 : public Ifoo / 继承了 Func1, Func2 virtual void Func2Ex(double nCount) = 0; ;,接口规则是COM规范的一部分,接口协议不可变,12,多态性指的是可以按同一种方式来处理不同的对象。若不同的组件支持相同的接口,那么客户就可以使用相同的方式来处理不同的组件。开发组件软件的一个最大的挑战是: (1)如何设计接口? (2)考虑因素:高复用性、适应性和灵活性、将来情况。,接口具有多态性,13,2.5、调用接口的方法,

7、COM 调用接口的方法 C+ 虚函数的调用方法。步骤1:获得组件对象的接口指针。步骤2:通过接口指针调用该接口的方法。假设有一个名为 CFoo 的 C+ 类,它实现了IFoo接口。注意,我们从 IFoo 继承,以保证我们按正确的顺序实现了正确的接口。 class CFoo : public Ifoo void Func1() /* . */ void Func2(int nCount) /* . */ ;,14,调用接口的方法的代码示例: #include / 不需要 CFoo,只需接口 void DoFoo() /1.获得接口指针。 IFoo *pFoo = Fn_That_Gets_An_

8、IFoo_Pointer_To_A_CFoo_Object(); / 2.调用接口的方法。 pFoo-Func1(); pFoo-Func2(5); ;要点:任何 COM 组件接口的调用方法都如上所示,而不管实现组件的语言是什么,也不管 COM 对象位于何处(位置透明)。,2.5、调用接口的方法(续),15,2.6、小节回顾,对象是 COM 的基本单元它是 COM 所创建的东西。接口是访问对象的唯一方式;是一种协议、一种约定。接口的使用方法(C+):pIX-Fx();接口实质上用C+ 虚函数的方式来描述。接口指针是虚函数表的指针的指针;,16,3.1、COM中的标识符,COM中的标识符包括:

9、(1)组件类型标识符 CLSID(是 GUID) (2)接口标识符 IID(是 GUID)。 (3)方法和属性标识符(是接口内部的相对编号)GUIDGEN.EXE程序可以创建全球唯一标识符GUID 是按 16 字节(128 位),固定结构。引用方式传递GUID:传地址,不是传值。目的:提高传递效率。 REFCLSID 和 REFIID 作为GUID地址的参数类型。 REFCLSID * CLSID REFIID = * IID要为每个组件(对象类型)创建一个 CLSID要为每个自定义接口创建一个 IID。,17,3.2、标准接口,COM 定义了大量的标准接口及其相关的 IID,如: (1)、未

10、知接口:IUnknown。 (2)、自动化接口:IDispatch。 (3)、连接点接口:IConnectionPoint。 (4)、持续性接口:IPersist系列接口。,18,3.3、未知接口IUnknown,IUnknown是所有接口的基础,是COM模型的实质。每个COM接口都必须从IUnknown继承过来。IUnknown接口提供了两个非常重要的特性:生存期控制和接口查询。IUnknown 接口有三个函数: HRESULT QueryInterface(REFIID riid,void *ppvObject); ULONG AddRef(); ULONG Release();,19,3

11、.4、自定义接口,自定义接口是您创建的接口。如Ifoo,IFoo接口的标识符为 IID_Ifoo 回忆原来的类声明: class CFoo : public Ifoo void Func1() /* . */ void Func2(int nCount) /* . */ ;将IFoo略作修改,就将它变成 COM 兼容的:Interface IFoo : IUnknown virtual HRESULT STDMETHODCALLTYPE Func1(void)=0;virtual HRESULT STDMETHODCALLTYPE Func2(int nCount)=0;,20,“Interf

12、ace” 并不是C+ 中的关键字,而是在相应的COM头文件中用 #define 定义为 “struct” 的。几乎所有的COM函数都返回一个 HRESULT值。 IFoo是从标准的COM接口IUnknown派生出来的。这意味着: (1)任何实现 IFoo 的类也需要同时实现 AddRef、Release 和 QueryInterface 这三个函数。 (2)在 IFoo 的虚函数表中,这三个函数的指针将位于 Func1 和 Func2 函数的指针之前。,3.4、自定义接口说明,21,3.5、IDL( Interface Definition Language),组件技术追求的目标?跨语言、跨平

13、台的重用。接口成为组件模型的焦点和核心:需要准确定义接口。选一种成熟的语言描述接口吧?C+能力最强,选它怎么样?事实上,C+不能准确表达在接口中需要表达的所有东西(如参数传递的方向、指针的准确用法)。这太重要了,要不然,使用组件的人和实现组件的人都不知到如何传递参数、处理内存了。怎么办? 定义一种新语言,就叫 IDL。太难了吧? 也是,那就在C+的基础上改一改算了。真是天才,发明新东西这么容易,可我还学得这么费劲。那IDL比起C+,到底增加了什么?就增加了一些“属性”太好了,让我看个例子吧。,22,如果新建接口 IFoo2,除了其他两个方法程序,还添加了一个方法程序 Func3(int *),IDL 会是这样: uuid(E312522F-A7B7-11D1-A52E-0000F8751BA7) Interface IFoo2 : IUnknown HRESULT Func1(); HRESULT Func2(int in_only); HRESULT Func3(in, out int *inout); ;IDL输出头文件的过程: VC或手工编写IDL MIDL编译 生成 .h和 .c等输出文件。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 其它文档

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