




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、com原理及应用-com对象和接口1、com对彖的理解com对象类似于c+语言中类的概念,类的每个实例代表一个com对象,它也包括 属性(即状态)和方法(即操作),状态反映对彖的存在,方法就是接口。2、com对象的标识一clsidguid是一个128位的随机数,重复概率极低。它的值来源于两部分:空间值(网卡地 址或随机数)和时间值。获得guid值可以使用vc+提供的工具:guidgen.exe和uuldgen.exe。或者使用 com 库的 api 函数 cocreatguid ()。3、com对彖打(2卄对彖的比较封装特性在com对象屮,数据是完全封装在对象内部,外部不可能肓接访问对象的数
2、据属性。通过com对象和客户程序提供的接口成员函数访问对象的属性。com对象 的数据成员的封装性是以组件为最终边界的,对于对象用户是完全透明的、不可 见的;而c+对象的封装特性只是语义上的封装,对于对象用户是可见的。com对彖将数据完全封装在对彖的内部。c+对彖的封装是在语义上的封装,通过不 同的数据类型实现数据的封装。可重用性com対象的可重用性表现在com対象的包容和聚合,一个対象可以完全使用另 一个对象的所有功能;而c+对象的可重川性表现在c卄类的继承性,派牛类可以 调用其父类的非私有成员函数。com対象的多态性通过其接口体现,c+对象的多态性通过英虚函数体现。4、com接口的作用和意义
3、com规范的核心内容是关于接i i的定义,虽然com木身并不复杂,但是用绕com接 口有很多内容值得仔细探讨,包括接口的标识、接口函数的调用习惯、参数处理、接口与对. 彖的关系以及接口与c/c+的关系、com接口多具有的特性等。com定义了一套完整的接口规范,不仅可以弥补api作为组件接口的不足,还从分发 挥了组件对象的优势,并实现了组件对彖的多态性。5、接口定义和标识接口是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能。客八程序使用一个接口数据结构的指针来调用接口成员函数。接口指针实际上又指向另一个指针,这第二个指针指向一组函数指针(即一组函数地址),成为接口函数
4、表。接口函数表中每一项为4个字节的函数指针,每个函数指针与对象的具体实现 联系起来。从技术上讲,接口是包含了一组函数的数据结构,通过这纽数据结构,客户代码可以调 用组件对象的功能。客户程序用一个指向接口函数结构的指针来调用接口成员函数。实际上接口指针指向另 一个指针pvtableo接口函数表称为虚函数表(virtual function table ,简称viable),指向vtable的指针为 pvtableo对于一个接口來说,它的虚函数表vtable是确定的。6、接口设计的问题在接口成员函数屮,字符串变量必须用unicode字符指针,这是com规范的要求。com api函数使用大多数语言惯
5、用的_stdcall调用习惯。川c语言定义com接口,需要有结构体struct定义其接口结构,接口成员函数必须有 一个this指针。用c卄语言定义com接i,因为由c卄语言class的实现机理可以看出,com接口结 构中的vtable与class的vtable (类的虚函数表)完全一致,因此,用class描述com接口 是最方便的手段。此时,接口成员函数隐藏了(his指针。class型接口的说明要比struct型接口的说明简捷得多。7、com接口与对象的联系接口类只是一种描述,并不提供具体的实现过程。如果com对象要实现接口,则com 对象必须以某种方式把它自身与接口类联系起来,然后把接口类的
6、指针暴露给客户程序,于 是客户程序就可以调用对象的接口功能了。用class型接口通过把接口指针(this)与对象数据绑定在一起的方法实现对com接口 的支持比较总观、简捷易于理解。实际上,也可以采用其他的方法來实现接口,只要接口成 员函数中this指针(即接口指针)与对象数据能建立确定的连接,在接口成员函数中可以访 问到对象数据即可。例如,vc+的mfc库和atl (active template library ,活动模板库) 模板库分別采用了不同的机制来提供对com接口的支持。8、接口描述语言idlcom规范在采用osf的dce规范描述远程调用接口 idl (interface descr
7、iption language ,接口描述语言)的慕础上,进行扩展形成了 com接口的描述语言。接口描述语 言提供了一种不依赖于任何语言的接口描述方法,因此,它可以成为组件程序和客户程序z 间的共同语言。com规范使用的idl接口描述语言不仅可用于定义com接口,同时还定义了一些常 用的数据类型,也可以描述自定义的数据结构,对于接口成员函数,我们可以制定每个参数 的类型、输入输出特性,甚至支持可变长度的数组的描述。vc+提供了 midl工具,可以 把idl接口描述文件编译成c/c+兼容的接口描述头文件(.h)。9、接口的内存模型com对彖往往有自己的属性数据,它们反映对彖的状态,并用于区分不同
8、的对彖。对 于有多个对象的客八,数据属性是不能公用的。1()、接口的特点二进制特性接口不变性继承性(扩展性):类似于c+屮类的继承性,接口也可以继承发展,但方式不同。类 继承不仅是说明继承,也是实现继承,即派生类可以继承基类的函数实现,而接口继承只是 说明继承,即派生的接口只继承了基接口的成员函数说明,而没有继承基接口的实现。类继 承允许多重继承,但接口继承只允许单继承。根据com规范,所有接口都必须从iunknown 派生,可以肓接派生,也可以间接派生。但人多数都是肓接派生。ole系统屮,接口最示 字母是“2”或“ex”的,标煤它是一个继承接口。多态性:com对象貝有多态性,其通过com接口
9、体现。11、iunknown接口提供了两个非常重要的特性:生存期控制(使用引用计数)和接口查询。12> iunknown接口引用计数的设置层级引用计数在组件一级实现则计数分辨率太粗(选择全局变量),在对彖一级实现恰好(使 用c+类的成员变量),在接口一级实现则计数分辨率太细(使用类成员变量)。13、使用引用计数的规则根据不同场合使丿ij或者传递接口指针标量进行分类,并给出相应的规则:(1)函数的参数中使川接口指针变量。输入参数:由于输入参数由调用函数控制,因此被调用函数执行过程中,接口指针一定 保持有效,引用计数不需要改变。输出参数:输出参数是指在被调用函数执行过程中进行赋值的参数,而且
10、被调用函数并 没有用到函数初始化传进來的值,输出参数相当于函数的一个返回值。在c/c+语言中,输 出参数为一个指针变量(com屮不使用引用变量)。因为输出参数相当于在被调川函数屮生 成了一个新的接口指针变量,因此,在被调用函数返回之前,对输出参数应该调用addref 使接口引用计数增lo这条规则也适用于函数返回值为接口指针变量的情况。输入一输出参数:在参数被修改z前,对原來传进來的接口指针调用release以使引用 计数减1,在参数被修改之后,对新的接口指针变量调川addref,以标记对新的接口指针 的引用。如果在函数执行过程中参数没有被修改,则不需要改变。(2)局部接口指针变量:因为在局部函
11、数块中,接口指针总是有效的,所以,一个局 部接口指针变量被赋了值并调用了接口成员函数,引用计数不需要改变。(3)全局接口指针变量:把全局接口指针变量作为输入参数传给某个函数之前,应该 调用addref以保证在函数调用中可以使用给接口指针变虽,因为它是全局变量,其他的函 数有町能会调用release函数。在函数返冋z后应该调用release函数。(4)c+中类成员变量为接口指针变量:i大i为对于类的作用域来讲,成员变量相当于 全局变量,因此适用于规则(3)o(5)当以上情形都不适合吋,使用以下一般的规则:在顺序执行过程i',如果要对一个接口指针变量赋值,则对赋值后的接口指针变量调丿ij
12、addref,并且,如果赋值前的接口指针变量还没有结束,则赋值前必须对它调用release以 便先结束它的使用。如果要结束使用一个接口指针变量,以后不再用到它了,则调用release函数。14、接口査询使用queryinterface函数查询接口,其返回值有s_ok、e_nointerface、 e_unexpectedo15、com对象的接口原则(1)对丁同一个对象的不同接口指针,查询得到的iunknown接口必须完全相同。即 每个对象的iunknown接口指针是唯一的。(2)接口对称性。即对一个接口查询其自身总应该成功。(3)接口自反性。(4)接口传递性。(5)接口查询吋间无关性。16、多
13、接口 com对象的实现方法在c+语言中有两种实现方法:一是使用多重继承,把所支持的接口作为其棊类,然后 在对彖类中实现接口成员函数;二是使用内欣接口类成员。com objects and interfaces一个对象实现一个接口,他的意思就是该对象使用代码实现了接口的每个方法并且为这些函数通向com库提供了 com的二进制指针。然后com使这些函数运行在 请求了 一个指向该接口的任何客户端。interfaces and interface implementationscom在接口的定义和实现上有根本的差别。一个接口实际上是由一组泄义了用法的相 联系的函数原型组成,只是他不能够被实现。这些函数
14、原型就相当丁-c+中含有纯虚拟函数 的基类。一个接口定义制定了接口的成员函数、调用方法、返回类型、他们的参数的数量和 类型,这些函数要t什么。但是这里并没有与接口实现相关的东酋。这些隊i数的具体“代码” 在“底层”,即com对象屮,即这些函数功能由com纟r件实现。一个接口的实现就是程序员在一个接口定义上提供的执行相关动作的代码。客户调用 完全是决定于接口的定义。interface pointers and interfaces接口实现的一个实例,实际上就是一个指向一组方法的指针,即是指指向一个接口的函 数表,该函数表引用了该接口所冇方法的实现。每个接口,是一个固定的i组方法的集合,在运行时通
15、过globally unique interface identifier (iid)来定位。这里,1id 是 com 支持的 globally unique identifier (guid)的特殊的 实例。这样做就不会产生单一系统上相同名字、接口的多个版本的comz间的冲突了。一个com接口与c卄类是不一样的;一个com接口不是一个对象他只是简单的关联一组函数,是客户和程序z间通信 的二进制标准。只要它提供了指向接口方法的指针,这个对彖就可以用任何语言来实现它。;com接口是强类型的一一每个接口有他自己的接口标识符;com接口的不变性你不能够用老版本的接口标识符定义新的版本,接口的iid定义的接ri合同是明确的、唯一的。iunknown and interface inheritance继承在com里并不意味着代码的重用。因为接口没有实现关联,接口继承并不意味 着代码继承。他的意思仅仅是,一个接口同一个合同关联,就像c卄的纯虚拟基类的创建和 修改样,可以添加方法或者更进一步的加强方法的使用。在com里没有选择性继承。如果 一个接口由另一个接口继承的话,他就包含了另一个接口定义的所有的方法。using and implementing iunknowncom为实现和使用对象和对象的内部通信提供了一个丰富的标准集合。对iunknown 接口的实现和使用的细节
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025上海市出租车租赁合同
- 2025年四川省进出口贸易合同范本
- 2024年航天器热控系统投资申请报告代可行性研究报告
- 初中生物2025学年冀少版七年级生物下学期期中模拟卷
- 2025地面涂料施工合同范本
- 2025年国内外购版权合同模板
- 2025办公室租赁合同范本样本
- 2025设备租赁合同范本6
- 2025浙江杭州劳动合同样本
- 2025合同法:合同的续约与解除
- 转移支付合同协议
- 挖机转让合同协议
- 库欣病诊治专家共识要点解读(2025年)解读课件
- (四调)武汉市2025届高中毕业生四月调研考试 数学试卷(含答案详解)
- 活动承办合同协议
- 2024年中国矿产资源集团大数据有限公司招聘笔试真题
- 2025年中考化学总复习加试化学实验操作评分标准全套汇编(完整版)
- 纸箱包装公司生产安全事故应急预案
- 防雷安全风险分级管控要求 油库、气库建设工程和场所
- 华侨大学《幼儿行为观察与指导》2023-2024学年第一学期期末试卷
- 【2025版】人教版一年级数学下册教学工作计划(含进度表)
评论
0/150
提交评论