为啥通过同一个 COM 对象的不同接口检索到的 IUnknown* 指针具有相同的值?

Posted

技术标签:

【中文标题】为啥通过同一个 COM 对象的不同接口检索到的 IUnknown* 指针具有相同的值?【英文标题】:Why do IUnknown* pointers retrieved through different interfaces of the same COM object have the same value?为什么通过同一个 COM 对象的不同接口检索到的 IUnknown* 指针具有相同的值? 【发布时间】:2011-04-22 06:51:25 【问题描述】:

我有以下 COM 接口的层次结构和一个实现它们的类:

interface IX : public IUnknown;
interface IY : public IUnknown;
class CA: public IX, public IY;

这里class CA 有效地从IUnknown 继承了两次。

我们知道class CA中有两个vtable指针——一个指向IX,另一个指向IY。所以IUnknown 存储在IX 子对象中与IUnknown 存储在IY 子对象中是不同的。

然而,当我们在同一个对象上调用 IX::QueryInterface()IY::QueryInterface() 并查询 IUnknown 时,我们会得到相同的 IUnknown* 指针。

为什么会这样?

【问题讨论】:

感谢您编辑我的问题,JaredPar。我的英语很差。非常感谢。 【参考方案1】:

这就是所谓的"object identity" requirement,它指出,每当您从两个对象请求IUnknown 时,如果它们是不同的对象,则会得到不同的指针,如果是相同的对象,则会得到相等的指针。

每个QueryInterface() 实现都必须满足这个要求。这通常由choosing which one IUnknown to return and sticking to it 完成:

HRESULT CA::QueryInterface( REFIID iid, void** ppv )

    if( iid == __uuidof( IUnknown ) ) 
        // Explicitly cast to one of base class subobjects.
        // Doesn't matter which one is chosen - it just has to be
        // the same base class subobject each time IUnknown is requested.
       IUnknown* selected = static_cast<IX*>( this );
       *ppv = selected;
       AddRef();
       return S_OK;
     else 
       continue for other interfaces
    

【讨论】:

是的,但是我想知道 QueryInterface 如何在有多个 IUnknow 接口的情况下实现返回相同的 IUnknow 指针。 @kenny:很简单,他们每次只投给其中一个 - 请参阅问题链接。

以上是关于为啥通过同一个 COM 对象的不同接口检索到的 IUnknown* 指针具有相同的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将检索到的对象从 parse.com 传递到 NSMutableArray 以与 UITableView 一起使用?

我正在尝试在我的应用程序中实现搜索栏,以便我可以搜索从 parse.com 检索到的对象

为啥从 json 操作中检索到的数据显示为未定义?

jquery选择器$("...")返回的是数组,为啥还能继续练式操作$("...").方法 ?

如何将检索到的数据从 v-for 绑定到 Vuejs 中的数据对象?

为啥要序列化