接口COM原理及应用-COM对象和接口

meilishuo com  时间:2021-01-21  阅读:()

COM原理及应用----COM对象和接口

1、 COM对象的理解

COM对象类似于C++语言中类的概念类的每个实例代表一个CO M对象它也包括属性即状态和方法即操作 状态反映对象的存在方法就是接口 。

2、 COM对象的标识CLSID

GUI D是一个128位的随机数重复概率极低。它的值来源于两部分空间值网卡地址或随机数和时间值。

获得GUID值可以使用V C++提供的工具 GUIDGe n.exe和UUIDGe n.exe。或者使用CO M库的API函数CoCr eatGui d。

3、 COM对象与C++对象的比较

封装特性

在COM对象中数据是完全封装在对象内部外部不可能直接访问对象的数据属性。通过COM对象和客户程序提供的接口成员函数访问对象的属性。 COM对象的数据成员的封装性是以组件为最终边界的对于对象用户是完全透明的、不可见的而C++对象的封装特性只是语义上的封装对于对象用户是可见的。

COM对象将数据完全封装在对象的内部。C++对象的封装是在语义上的封装通过不同的数据类型实现数据的封装。

可重用性

COM对象的可重用性表现在COM对象的包容和聚合一个对象可以完全使用另一个对象的所有功能而C++对象的可重用性表现在C++类的继承性派生类可以调用其父类的非私有成员函数。

COM对象的多态性通过其接口体现 C++对象的多态性通过其虚函数体现。

4、 COM接口的作用和意义

COM规范的核心内容是关于接口的定义虽然COM本身并不复杂但是围绕CO M接口有很多内容值得仔细探讨包括接口的标识、接口函数的调用习惯、参数处理、接口与对象的关系以及接口与C/C++的关系、 COM接口多具有的特性等。

COM定义了一套完整的接口规范不仅可以弥补API作为组件接口的不足还从分发挥了组件对象的优势并实现了组件对象的多态性。

5、接口定义和标识

接口是包含了一组函数的数据结构通过这组数据结构客户代码可以调用组件对象的功能。客户程序使用一个接口数据结构的指针来调用接口成员函数。接口指针实际上又指向另一个指针这第二个指针指向一组函数指针即一组函数地址 成为接口函数表。接口函数表中每一项为4个字节的函数指针每个函数指针与对象的具体实现联系起来。

从技术上讲接口是包含了一组函数的数据结构通过这组数据结构客户代码可以调用组件对象的功能。

客户程序用一个指向接口函数结构的指针来调用接口成员函数。实际上接口指针指向另一个指针pVta ble。

接口函数表称为虚函数表Virtua lFuncti onTable 简称vtab le指向vtab le的指针为pVtabl e。对于一个接口来说它的虚函数表vtable是确定的。

6、接口设计的问题

在接口成员函数中字符串变量必须用Unic ode字符指针这是COM规范的要求。

COM API函数使用大多数语言惯用的_st dcall调用习惯。

用C语言定义COM接口需要有结构体struct定义其接口结构接口成员函数必须有一个this指针。

用C++语言定义CO M接口因为由C++语言clas s的实现机理可以看出 COM接口结构中的vta ble与cl ass的vt able 类的虚函数表完全一致因此用class描述COM接口是最方便的手段。此时接口成员函数隐藏了thi s指针。c las s型接口的说明要比stru ct型接口的说明简捷得多。

7、 COM接口与对象的联系

接口类只是一种描述并不提供具体的实现过程。如果COM对象要实现接口 则COM对象必须以某种方式把它自身与接口类联系起来然后把接口类的指针暴露给客户程序于是客户程序就可以调用对象的接口功能了。

用c las s型接口通过把接口指针this与对象数据绑定在一起的方法实现对CO M接口的支持比较直观、简捷易于理解。实际上也可以采用其他的方法来实现接口只要接口成员函数中thi s指针即接口指针与对象数据能建立确定的连接在接口成员函数中可以访问到对象数据即可。例如VC++的MFC库和ATLactive templa te librar y活动模板

库模板库分别采用了不同的机制来提供对COM接口的支持。

8、接口描述语言IDL

COM规范在采用O SF的DCE规范描述远程调用接口ID Linterf ace descri ption language 接口描述语言的基础上进行扩展形成了COM接口的描述语言。接口描述语言提供了一种不依赖于任何语言的接口描述方法 因此它可以成为组件程序和客户程序之间的共同语言。

COM规范使用的I DL接口描述语言不仅可用于定义COM接口 同时还定义了一些常用的数据类型也可以描述自定义的数据结构对于接口成员函数我们可以制定每个参数的类型、输入输出特性甚至支持可变长度的数组的描述。VC++提供了MID L工具可以把IDL接口描述文件编译成C/C++兼容的接口描述头文件.h。

9、接口的内存模型

COM对象往往有自己的属性数据它们反映对象的状态并用于区分不同的对象。对于有多个对象的客户数据属性是不能公用的。

10、接口的特点

二进制特性

接口不变性

继承性扩展性类似于C++中类的继承性接口也可以继承发展但方式不同。类继承不仅是说明继承也是实现继承 即派生类可以继承基类的函数实现而接口继承只是说明继承 即派生的接口只继承了基接口的成员函数说明而没有继承基接口的实现。类继承允许多重继承但接口继承只允许单继承。根据COM规范所有接口都必须从IUnknown派生可以直接派生也可以间接派生。但大多数都是直接派生。O LE系统中接口最后字母是“2”或“Ex”的标煤它是一个继承接口。

多态性 COM对象具有多态性其通过COM接口体现。

11、 IUnkno wn接口提供了两个非常重要的特性生存期控制使用引用计数和接口查询。

12、 IUnkno wn接口引用计数的设置层级

引用计数在组件一级实现则计数分辨率太粗选择全局变量 在对象一级实现恰好使用C++类的成员变量 在接口一级实现则计数分辨率太细使用类成员变量。

13、使用引用计数的规则

根据不同场合使用或者传递接口指针标量进行分类并给出相应的规则

 1函数的参数中使用接口指针变量。

输入参数 由于输入参数由调用函数控制 因此被调用函数执行过程中接口指针一定保持有效 引用计数不需要改变。

输出参数输出参数是指在被调用函数执行过程中进行赋值的参数而且被调用函数并没有用到函数初始化传进来的值输出参数相当于函数的一个返回值。在C/C++语言中输出参数为一个指针变量COM中不使用引用变量 。因为输出参数相当于在被调用函数中生成了一个新的接口指针变量 因此在被调用函数返回之前对输出参数应 该调用Add Ref使接口引用计数增1。这条规则也适用于函数返回值为接口指针变量的情况。

输入输出参数在参数被修改之前对原来传进来的接口指针调用Relea se以使引用计数减1在参数被修改之后对新的接口指针变量调用A ddRef 以标记对新的接口指针的引用。如果在函数执行过程中参数没有被修改则不需要改变。

2局部接口指针变量 因为在局部函数块中接口指针总是有效的所以一个局部接口指针变量被赋了值并调用了接口成员函数 引用计数不需要改变。

3全局接口指针变量把全局接口指针变量作为输入参数传给某个函数之前应该调用AddRef以保证在函数调用中可以使用给接口指针变量 因为它是全局变量其他的函数有可能会调用Release函数。在函数返回之后应该调用R elease函数。

4C++中类成员变量为接口指针变量 因为对于类的作用域来讲成员变量相当于全局变量 因此适用于规则3。

5当以上情形都不适合时使用以下一般的规则

在顺序执行过程中如果要对一个接口指针变量赋值则对赋值后的接口指针变量 调用AddR ef并且如果赋值前的接口指针变量还没有结束则赋值前必须对它调用Re lease以便先结束它的使用。

如果要结束使用一个接口指针变量 以后不再用到它了则调用Rel ease函数。

14、接口查询

使用Quer yInter face函数查询接口其返回值有S_OK、 E_NOIN TERFAC E、 E_UNEXPECTED。

15、 COM对象的接口原则

1对于同一个对象的不同接口指针查询得到的I Unknow n接口必须完全相同。即每个对象的IUnkno wn接口指针是唯一的。

2接口对称性。即对一个接口查询其自身总应该成功。

3接口自反性。

4接口传递性。

5接口查询时间无关性。

16、多接口COM对象的实现方法

在C++语言中有两种实现方法一是使用多重继承把所支持的接口作为其基类然后在对象类中实现接口成员函数二是使用内嵌接口类成员。

COM Objects and Interfaces

一个对象实现一个接口他的意思就是该对象使用代码实现了接口的每个方法

并且为这些函数通向com库提供了co m的二进制指针。然后com使这些函数运行在

请求了一个指向该接口的任何客户端。

Interfaces and Interface Implementations

COM在接口的定义和实现上有根本的差别。一个接口实际上是由一组定义了用法的相联系的函数原型组成只是他不能够被实现。这些函数原型就相当于C++中含有纯虚拟函数的基类。一个接口定义制定了接口的成员函数、调用方法、返回类型、他们的参数的数量和类型这些函数要干什么。但是这里并没有与接口实现相关的东西。这些函数的具体“代码”在“底层” 即COM对象中 即这些函数功能由COM组件实现。

一个接口的实现就是程序员在一个接口定义上提供的执行相关动作的代码。客户调用完全是决定于接口的定义。

Interface Pointers and Interfaces

接口实现的一个实例实际上就是一个指向一组方法的指针 即是指指向一个接口的函数表该函数表引用了该接口所有方法的实现。

每个接口是一个固定的一组方法的集合在运行时通过global ly unique interf aceidenti fier (IID)来定位。这里 IID是co m支持的gl obally unique identi fier(GUID)的特殊的实例。这样做就不会产生单一系统上相同名字、接口的多个版本的COM之间的冲突了。

一个COM接口与C++类是不一样的

一个COM接口不是一个对象——他只是简单的关联一组函数是客户和程序之间通信的二进制标准。只要它提供了指向接口方法的指针这个对象就可以用任何语言 来实现它。 

COM接口是强类型的——每个接口有他自己的接口标识符

· COM接口的不变性——你不能够用老版本的接口标识符定义新的版本接口的IID定义的接口合同是明确的、唯一的。

IUnknown and Interface Inheritance

继承在COM里并不意味着代码的重用。因为接口没有实现关联接口继承并不意味着代码继承。他的意思仅仅是一个接口同一个合同关联就像C++的纯虚拟基类的创建和修改样可以添加方法或者更进一步的加强方法的使用。在COM里没有选择性继承。如果一个接口由另一个接口继承的话他就包含了另一个接口定义的所有的方法。

Using and Implementing IUnkno wn

COM为实现和使用对象和对象的内部通信提供了一个丰富的标准集合。对IUnkn own接口的实现和使用的细节请参见下面主题QueryI nterfa ce:Naviga ting in an Object 。Rules for Implementing QueryInterfac e

管理实现一个COM对象的IUnkno wn::QueryI nterfa ce方法的三个主要规则

1对象必须要有一个标识符

2一个对象实例的接口集合必须是静态的static 

3在对象中从任何一个其他的接口查询此接口都应该成功。

通过引用计数来管理对象的生命周期

使用AddRe f  //增加引用

Realas e  //减少引用

RAKsmart美国洛杉矶独立服务器 E3-1230 16GB内存 限时促销月$76

RAKsmart 商家我们应该较多的熟悉的,主营独立服务器和站群服务器业务。从去年开始有陆续的新增多个机房,包含韩国、日本、中国香港等。虽然他们家也有VPS主机,但是好像不是特别的重视,价格上特价的时候也是比较便宜的1.99美元月付(年中活动有促销)。不过他们的重点还是独立服务器,毕竟在这个产业中利润率较大。正如上面的Megalayer商家的美国服务器活动,这个同学有需要独立服务器,这里我一并整理...

腾讯云爆款秒杀:1C2G5M服务器38元/年,CDN流量包6元起

农历春节将至,腾讯云开启了热门爆款云产品首单特惠秒杀活动,上海/北京/广州1核2G云服务器首年仅38元起,上架了新的首单优惠活动,每天三场秒杀,长期有效,其中轻量应用服务器2G内存5M带宽仅需年费38元起,其他产品比如CDN流量包、短信包、MySQL、直播流量包、标准存储等等产品也参与活动,腾讯云官网已注册且完成实名认证的国内站用户均可参与。活动页面:https://cloud.tencent.c...

DMIT:美国cn2 gia线路vps,高性能 AMD EPYC/不限流量(Premium Unmetered),$179.99/月起

DMIT怎么样?DMIT最近动作频繁,前几天刚刚上架了日本lite版VPS,正在酝酿上线日本高级网络VPS,又差不多在同一时间推出了美国cn2 gia线路不限流量的美国云服务器,不过价格太过昂贵。丐版只有30M带宽,月付179.99美元 !!目前,美国云服务器已经有个4个套餐,分别是,Premium(cn2 gia线路)、Lite(普通直连)、Premium Secure(带高防的cn2 gia线...

meilishuo com为你推荐
软银亏损65亿美元马云仅仅持有阿里8.9%的股份,就有270多亿美元,孙正义的软银占有那么多股份,怎么还不是亚洲首富电脑管家和360哪个好电脑管家和360卫士哪个好?少儿英语哪个好少儿英语哪种的好?炒股软件哪个好网上买卖股票软件哪个好用车险哪个好买汽车保险,买哪几种比较好播放器哪个好什么播放器好用看书软件哪个好小说阅读软件哪个好行车记录仪哪个好请问行车记录仪那个牌子好?美国国际东西方大学你知道美国哪些大学有预科课程吗飞信空间登录请问如何登陆我的飞信空间?
联通vps edgecast la域名 双12活动 tk域名 typecho 云鼎网络 嘉洲服务器 申请个人网站 vip购优汇 可外链网盘 cn3 网络空间租赁 vip域名 in域名 主机管理系统 atom处理器 国内空间 中国电信宽带测速 万网服务器 更多