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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HTML登录界面的实现详解

    HTML登录界面的实现详解前言序锦前阵子参加学校的暑期实习,我作为项目负责人,除了进行统筹规划,整体运营以及进度安排等工作外呢,我还负责了前端模块,参与并编写了前端页面,在之前学过前端的基础上,本次参与前端的编写就比较容易了,我和另外一个伙伴我们选择了套用模板,在模板的基础上修改成我们想要的样子,这一点很重要,在这样一个很短的时间内,进行前端的编写,我们最好的选择就是进行模板的修改,但对于初学者来说,就算是…

    2022年5月11日
    75
  • OWASP TOP10系列之#TOP1# A1-注入类「建议收藏」

    OWASP TOP10系列之#TOP1# A1-注入类「建议收藏」OWASPTOP10系列之#TOP1#注入类提示:本系列将介绍OWASPTOP10安全漏洞相关介绍,主要针对漏洞类型、攻击原理以及如何防御进行简单讲解;如有错误,还请大佬指出,定会及时改正~文章目录OWASPTOP10系列之#TOP1#注入类前言一、注入类漏洞是什么?二、什么情况下会产生注入类漏洞问题?三、如何预防?四、具体示例1.SQL注入2.OS命令注入3.XPath注入总结前言在OWASP(开放式Web应用程序安全项目)公布的10项最严重的Web应用程序安全风险列表的在

    2022年5月15日
    34
  • 关于python的论文参考文献_java毕业论文参考文献

    关于python的论文参考文献_java毕业论文参考文献java论文参考文献英文时间:2015-06-12来源:未知本文字数:14132字作者:小韩单位:在写java毕业论文或高水平java学术论文时,要求参考一些java英文参考文献,外文文献一般体现了国际最新研究进展,让我们写的java论文与国际接轨,为了方便大家,这里学术堂整理了150篇Java论文参考文献英文。更多2020年最新java论文参考文献英文,请在文章末尾处查看。java论文参考…

    2022年9月28日
    0
  • 过程控制系统与仪表pdf_计算机控制技术课程设计之炉温

    过程控制系统与仪表pdf_计算机控制技术课程设计之炉温目录一课程设计内容任务,,,,,,,,,,,,,,,,,,,,,,3二对课设任务的解读,,,,,,,,,,,,,,,,,,,,,,3三系统结构模型框图,,,,,,,,,,,,,,,,,,,,,,3四各部分程序流程图,,,,,,,,,,,,,,,,,,,,,,4五数字控制器设计,,,,,,,,,,,,,,,,,,,,,,5六系统仿真,,,,,,,,,,,,,,,,,,,…

    2022年9月29日
    2
  • 8种HOOK技术[通俗易懂]

    8种HOOK技术[通俗易懂]1.IAT_HOOKIAT是程序中存储导入函数地址的数据结构,如果HOOK了导入函数地址。就可以在函数调用的时候,将函数流程HOOK到我们指定的流程。但是我个人觉得这种方式最好要结合DLL注入的方式,如果单纯的使用HOOK,那么就需要将需要执行的操作的shellcode写入目标进程,如果操作复杂,可能需要的shellcode量特别大,所以我们需要借助DLL注入,这样就将我们需要执行的代码写入…

    2022年5月26日
    34
  • Android实现点击两次返回退出APP

    Android实现点击两次返回退出APPAndroid实现点击两次退出APP这两天在做一个项目碰到这么个问题,需要主界面点击两次直接退出整个APP而不是返回上一个界面,查找了网上的资料,整合和修改了一下写了这篇博客。这里我主要以我的项目

    2022年7月1日
    27

发表回复

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

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