加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么通过同一COM对象的不同接口检索的IUnknown *指针具有

发布时间:2020-12-16 09:34:12 所属栏目:百科 来源:网络整理
导读:我有以下COM接口层次结构和一个实现它们的类: interface IX : public IUnknown{};interface IY : public IUnknown{};class CA: public IX,public IY{}; 这里的类CA有效地继承了IUnknown两次. 我们知道CA类中有两个vtable指针 – 一个指向IX,另一个指向IY.因
我有以下COM接口层次结构和一个实现它们的类:

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

这里的类CA有效地继承了IUnknown两次.

我们知道CA类中有两个vtable指针 – 一个指向IX,另一个指向IY.因此,存储在IX子对象中的IUnknown与存储在IY子对象中的IUnknown不同.

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

为什么会这样?

解决方法

这就是所谓的 “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
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读