一、COM组件的目标:

COM组件的一个主要优势是:便于升级。

要实现这个优势需要满足一下两个条件:

1、运行时从客户程序动态加载和卸载,采用DLL技术可以实现。

2、为了更好的突出DLL的优势,还需要信息隐藏,即封装性。

二、COM组件的信息隐藏采用IUnknown接口来实现:

1、IUnknown接口功能简介:

IUnknown意思是未知,即未知的接口。采用这个名字是为了简单起见,所有的COM接口都需要继承IUnknown,因此若某个客户拥有一个IUnknown接口的指针,也就不知道接口到底是什么类型的,只需要知道此接口可以用来查询其他接口。IUnknown接口有一个用来查询接口的函数QueryInterface。由于所有的COM组件接口都从IUnknown接口继承,因此所有的接口都有QueryInterface函数,通过QueryInterface可以查询到任何接口,因此也就不需要单独维护一个代表组件的指针。

2、QueryInterface功能简介:

客户可以通过IUnknown中包含的QueryInterface函数查询某个组件是否支持某个特定的接口。

若支持,QueryInterface将返回指向此接口的指针。

否则,将返回一个错误代码。

然后,客户可以接着查询其它接口或将组件卸载。

3、QueryInterface函数遵循的规则:

QueryInterface的实现需要遵循一些规则,以便于客户能够获取关于组件的足够多的知识并对之实施一些控制和其他有用的处理。QueryInterface的行为必须是稳定的。

<1>、QueryInterface返回IUnknown接口时,总是返回同一IUnknown指针。

每个组件实例只有一个IUnknown接口,因此当查询组件实例的IUnknown接口时,不论通过那个接口查询,得到的均将是同一指针值。

总结:遵循这一规则能确定两个接口是否指向同一组件。

<2>、客户可以获取曾经得到过的接口。

若对于某个给定的接口,QueryInterface曾经成功过,那么对于同一组件的后续QueryInterface将总是成功的。

总结:若不遵循这一规则客户将无法通过编程的方法来决定组件到底有一些什么样的功能。

<3>、 可以再次获取已经拥有的接口,即通过A接口查询A接口指针。

<4>、 客户可以从任何接口返回到起始接口,即若通过A接口可以查询到B接口,那么可以通过B接口查询到A接口(对称性)。

<5>、若能够从某接口获取到某特定的接口,则从任意的接口都将能获取此接口(传递性)。

若可以从A接口查询到B接口,从B接口查询到C接口,那么可以从A接口查询到C接口。

总结:这条规则使得QueryInterface是可用的,即某接口的查询不是必须依赖于某个接口查询。

总结:COM为QueryInterface制定上述规则的目的使为了使QueryInterface使用起来更为简单、更富有逻辑性、更一致及更具确定性。

QueryInterface定义了组件,因此是COM最为重要的部分。组件所支持的接口集就是QueryInterface能够返回接口指针的那些接口。

三、COM组件新旧版本的处理:

COM组件一旦发布出去,接口将永远保持不变。接口不变是指不能改变接口(IID),但是可以建立一个新的接口(同时再为接口指定一个新的IID)。

1、COM组件对新旧版本的处理机制:

当QueryInterface接受到对老IID查询时,返回老的接口。

接收到对新的IID的查询时,它将返回新的接口查询。

对QueryInterface而言,一个IID就是一个接口,所以同某个IID相应的接口绝不会发生变化。

对于老的接口仍然保持不变,因此已有客户的运行将不会受到任何影响。

对于新客户则可以自行决定使用老接口还是新接口。

这种处理多个版本的方法最有效的地方在于它是无缝的。客户不需要做任何附加的动作,因为接口的标志符同其版本是完全绑定在一块的。

2、建立一个新版本的时机:

为了使COM处理多个版本的机制能够起作用,当下列条件中的任何一个改变时,就应给新接口指定新的IID:

<1>、接口中函数的数目。

<2>、接口中函数的顺序。

<3>、某个函数的参数。

<4>、某个函数的参数顺序。

<5>、某个函数的参数类型。

<6>、函数可能的返回值。

<7>、函数返回值的类型。

<8>、函数参数的含义。

<9>、接口中函数的含义。

总结:只要是所做的修改为导致已有客户的正常运行,都应为接口指定新的IID。

http://www.cnblogs.com/iameasy_man/archive/2009/10/11/1580824.html

转载于:https://www.cnblogs.com/newlist/archive/2012/07/05/2577741.html

IUnknown接口QueryInterface函数介绍相关推荐

  1. IUnKNown接口——QueryInterface函数

    转自:IUnKNown接口--QueryInterface函数 客户同组件的交互都是通过一个接口完成的.在客户查询组件的其他接口时,也是通过接口完成的.这个接口就是IUnknown.它在UNKNWN. ...

  2. ArcGIS Engine 开发 (三)COM技术中的QueryInterface(接口查询)的实现原理和IUnknown接口

    IUnknown IUnknown 接口是组件对象模型(COM)中的基础接口.COM规格书中规定COM对象至少要实现此一接口,而且其他所有的COM接口都需要派生自IUnknown接口. IUnknow ...

  3. vba 云服务器,EXCEL服务器中VBA接口函数介绍

    EXCEL服务器中VBA接口函数介绍 日期:2017-11-27 14:40  |  分类:最新资讯  |  人气: EXCEL服务器中VBA接口函数 SaveReport 作用:保存报表模板或者报表 ...

  4. C++ 编程之QueryInterface函数(一)

    前言 组件对外公布的是接口:一个组件可以实现多个接口,也就是说可以对外公布多个接口,之前也总结过了,你很少会100%的去完全了解一个组件的所有接口,就像你去学习编程一样,你几乎不可能去成为编程中的全才 ...

  5. COM技术内幕--QueryInterface函数

    接口查询: 在客户查询组件的其他接口时,也是通过接口完成的.这个接口就是IUnknown. 头文件包含在Win32 SDK的unknwn.h头文件中. 引用如下: interface IUnknown ...

  6. C++ COM编程之QueryInterface函数(一)

    前言 组件对外公布的是接口:一个组件可以实现多个接口,也就是说可以对外公布多个接口,之前也总结过了,你很少会100%的去完全了解一个组件的所有接口,就像你去学习编程一样,你几乎不可能去成为编程中的全才 ...

  7. COM笔记-QueryInterface函数

    客户同组件的交互都是通过一个接口完成的.在客户查询组件的其他接口时,也是通过接口完成的.这个接口就是IUnknown.它在UNKNWN.H头文件定义 :如下 Interface IUnknown{vi ...

  8. 延时函数介绍和呼吸灯的实现

    文章目录 延时函数介绍 呼吸灯原理 杨桃32学习笔记,本文图片文字皆为转述 延时函数介绍 分为delay_s秒,delay_ms毫秒,delay_us微秒延时,最大参数不能超过65535. 呼吸灯原理 ...

  9. com关于IUnknown接口

    com定义的每个接口都必须从IUnknown继承过来,主要原因是IUnknown接口提供了两个很重要的特性:生存期控制和接口查询. 客户程序仅仅能通过接口与com对象进行通信.尽管客户程序能够无论对象 ...

最新文章

  1. 高手问答精选:Go 语言 —— 云计算时代的 C 语言
  2. PYTHON如何在内存中生成ZIP文件
  3. firefox 4b7截图
  4. 201671030107胡文艳实验三作业互评与改进报告
  5. 用C# itextsharp.dll制作PDF文件全攻略
  6. 如何从硬件到防火墙设置homelab
  7. 基于JAVA+Servlet+JSP+MYSQL的在线答疑系统
  8. cannot enable both sham-link state-change interface traps
  9. truffle和remix区别
  10. 213.打家劫舍II
  11. C语言数字图像处理进阶---6 LOMO滤镜
  12. 一条互联网广告多少钱?
  13. 讯飞、有道、谷歌、微软语音sdk集成总结
  14. 【关于3D-R2N2的配置和使用】
  15. ipad无线无法连接到服务器,ipad无法连接无线路由器原因有哪些【解决方法】
  16. Qt之使用GraphicsView框架实现思维导图功能
  17. 手机上的计算机黑屏怎么办,手机黑屏是怎么回事,教您苹果手机黑屏怎么办
  18. Maven 入门教程
  19. 这样美化PPT图表,真的好看到爆~
  20. 服务器开机grub gt 命令修复方法,开机grubgt命令修复方法

热门文章

  1. NLog日志框架使用探究
  2. 事业单位考试题库计算机网络,2015年事业单位计算机基础知识试题及答案
  3. php 点击之后保留样式,通过不修改arc.archives.class.php而保留原有样式调上一篇下一篇...
  4. java的rserve实现_Java 使用 Rserve 实现与 R 的通信
  5. mysql导出如何不区分大小写_mysql 不区分大小写
  6. Lucene学习总结之三:Lucene的索引文件格式(2)
  7. XCode 10 升级问题总结
  8. Linux跨平台远程控制
  9. 新手学习Java必需要知道的这些基本概念!
  10. 物联网数据终端演进之道