• COM编程中的接口查询QueryInterface的实现原理


    我们都知道,COM组件编程中,QueryInterface实现的接口之间的查询,通过这个接口,我们可以获取该组件中其他的接口。但 是,QueryInterface实现的原理,并不是大家都很清楚,也没有哪本书仔细讲了这点。我将个人心得写下来,供有需要的人查看。首先,我们看一下 基本的COM实现。一般来说,COM是 通过多继承实现多个接口,如下图

    而对应的QueryInterface实现如下

    HRESULT 实现类::QueryInterface(  const  IID &  iid, void   ** ppv)
    {
           
    if ( iid == IID_IUnknown)
              
    * ppv = (接口一 * this ;
         
    else
         
    if ( iid ==  IID_接口一)
            
    * ppv = (j接口一 * this

          
    // 其他以此类推
    }


     

    在查询IUnknown接口的时候,如下面查询

    IUnknwon  * Unknown;
    实现类.QueryInterface(IID_IUnknown,
    void ( ** )Unknown);
    // 其他以此类推

    看完了如何使用,我们现在讲实现原理.首先,QueryInterface通过传入的IID参数来判断要查询哪个接口.

    因为多个接口的实现是通过多继承实现的。所以,实现类的的内存结构 (参照 Inside the c++ object mode )如下图

    注意,QueryInterface中查询的时候,是将实现类的this指针强制转换成要查询的接口的类型,这个时候在内存中发生的操作是将 this的内存块切割成要查询的接口的内存大下,然后将这块内存起始地址 填入传入的void指针。这就获取了要查询的接口。因为实现类的内存中是包含了要查询的接 口的内存结构,因此,上面的操作是可实现的。整个过程如下图

    这就是接口查询的实现原理。

    至于组件的另外一种基于模板的实现,例如ATL,就比较复杂,看有需要的话再写关于这方面的文章。

    上面的过程是我自己个人总结出来的。如果错误,请各位指正。

    感觉讲得太好,忍不住抄袭了,呵呵

    推荐这本书:Inside the c++ object mode,可惜网上就找到英文电子版,看着累

  • 相关阅读:
    Palindrome Linked List 解答
    Word Break II 解答
    Array vs Linked List
    Reverse Linked List II 解答
    Calculate Number Of Islands And Lakes 解答
    Sqrt(x) 解答
    Find Median from Data Stream 解答
    Majority Element II 解答
    Binary Search Tree DFS Template
    188. Best Time to Buy and Sell Stock IV
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1994765.html
Copyright © 2020-2023  润新知