COM :IUnknown接口QueryInterface函数介绍

COM :IUnknown接口QueryInterface函数介绍
一、COM组件的目标:
COM组件的一个主要优势是:便于升级。
要实现这个优势需要满足一下两个条件:
1、运行时从客户程序动态加载和卸载,采用DLL技术可以实现。
2、为了更好的突出DLL的优势,还需要信息隐藏,即封装性。
二、COM组件的信息隐藏采用IUnknown接口来实现:
      1、IUnknown接口功能简介:
IUnknown意思是未知,即未知的接口。采用这个名字是为了简单起见,所有的COM接口都需要继承I

大家好,又见面了,我是你们的朋友全栈君。

一、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对象的接口原则:

1、    对于同一个对象的不同接口指针,查询得到的Iunknow接口必须完全相同。

2、    接口对称性:对一个接口查询其自身总应该成功。

3、    接口自反性:如果从一个接口指针查询到另一个接口指针,则从第二个接口指针再回到第一个接口指针必定成功。

4、    接口传递性:如果从第一个接口指针查询到第二个接口指针,从第二个接口指针可以查询到第三个接口指针,则从第一个接口指针一定可以查询到第三个接口指针。

5、    接口查询时间无关性:如果在某一个时刻可以查询到某一个接口指针,则以后任何时候查询同样的接口指针,一定可以查询成功。

 

总结: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。

 

struct IUknown{

            //this function is used to retrieve other interface

            virtual HRESULT stdcall QueryInterface(const IID &iid,(void**)ip) = 0;

            //this is used to increament interface reference count

            virtual ULONG    stdcall AddRef()=0;

            //this is used to decrement interface reference ocunt

            virtual ULONG    stdcall Release()=0;

 

};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162914.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • shiro框架的基本理解[通俗易懂]

    shiro框架的基本理解[通俗易懂]1.简介shiro是一个安全框架,可以进行认证、授权、密码加密、会话管理从外部来解析shiro框架:Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManage

    2022年9月3日
  • 共享打印机错误代码709_连接共享打印机错误0*0000011b

    共享打印机错误代码709_连接共享打印机错误0*0000011b最近发现很多用户连接或安装局域网共享的打印机时出现很多问题,常见的错误代码是0x0000011b和0x00000709或0x000006d9这三个错误。要如何解决呢?下面来讲一下如何解决这两个问题。键盘组合键徽标键Win+R键打开运行,在弹出的运行框中输入【services.msc】确定打开服务窗口,检查这两个服务是否已启动:PrintSpooler和WindowsFirewall一般Win7易出的错误6d9是后面的服务未启动所致。依次查找并卸载KB5005565、KB5005566、KB5005…

    2022年9月10日
  • NetworkManager 使用「建议收藏」

    NetworkManager 使用「建议收藏」NetworkManagerNetworkManageraimsforNetworkConnectivitywhich”JustWorks”.Thecomputershouldusethewirednetworkconnectionwhenit’spluggedin,butautomaticallyswitchtoawirelessc

    2022年10月5日
  • 完美解决VMware Tools一直灰色 无法安装问题!从问题分析 到成功安装 !保姆级教学!!

    完美解决VMware Tools一直灰色 无法安装问题!从问题分析 到成功安装 !保姆级教学!!我不知道你使用的版本是啥,请耐心看完其余版本我不知道务必对号入座:记录日期:2020/12/15Ubantu:ubuntu-20.04.1-desktop-amd64.iso(到现在为止最新版)Vmware:VMware-workstation-full-16.1.0-17198959.exe(到现在为止最新版)问题描述:新手想安装VMwaretools与主机进行文件共享虚拟机(M)–>安装VMwareTools(T)一直显示灰色按键一直不好使尝试了很多次什么

    2022年5月25日
  • python 列表转字符串[通俗易懂]

    python 列表转字符串[通俗易懂]python中list转字符串命令:”.join(list)其中,引号中是字符之间的分割符,如“,”,“;”,“\t”等等如:list=[1,2,3,4,5]”.join(list)结果即为:12345′,’.join(list)结果即为:1,2,3,4,5

    2022年6月13日
  • html页面调用高德地图,html前端使用高德地图入门教程「建议收藏」

    html页面调用高德地图,html前端使用高德地图入门教程「建议收藏」文章目录开始准备工作注册Key前期页面上的准备插件使用插件使用步骤引入插件定位自定义地图显示位置和缩放级别添加实时路况图层获取定位信息(需要使用插件)浏览器定位IP定位获取当前城市信息覆盖物添加覆盖物获取覆盖物覆盖物的操作图层设置图层获取图层移除图层3D地图未完待续…开始准备工作注册Key如果开发者账号包括Key已经有了,请忽略此步骤首先,注册开发者账号,成为高德开放平台开发者登陆之后,在进入…

    2022年5月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号