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

Why do IUnknown* pointers retrieved through different interfaces of the same COM object have the same value?

本文关键字:指针 IUnknown 接口 COM 对象 为什么 检索      更新时间:2023-10-16

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

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

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

我们知道class CA中有两个虚表指针,一个指向IX,另一个指向IY。因此,IX子对象中存储的IUnknownIY子对象中存储的IUnknown是不同的。

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

为什么会发生?

这就是所谓的"对象同一性"要求,即无论何时从两个对象请求IUnknown,如果它们是不同的对象,则得到不同的指针,如果它们是相同的对象,则得到相等的指针。

每个QueryInterface()实现都必须满足这个要求。这通常是通过选择返回哪个IUnknown并坚持使用它来完成的:

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
    }
}