COM聚合技术中的QueryInterface

本文探讨了在COM聚合技术中QueryInterface的问题,特别是外部组件如何通过NondelegatingQueryInterface获取内部组件接口的过程。通过分析C++的内存对象布局和虚函数表,解释了强制类型转换后导致调用NondelegatingQueryInterface的原因,并通过示例代码说明了多重继承在转换过程中的影响。最终揭示了COM只关心虚函数表结构而非接口名称的本质。
摘要由CSDN通过智能技术生成

最近在看COM聚合技术时遇到一个关于QueryInterface的问题。在《COM技术内幕》和《COM原理与应用》中都是寥寥数句带过,看起来很易理解,我却看了许久才有所领悟。

先说明一下,为了节省篇幅,对于一些约定俗成的代码和变量,下文不再进行说明,如内部组件指向外部组件的m_pUnknownOuter和外部组件指向内部组件的m_pUnknownInner等,这些内容在相关书籍都有描述。

问题描述:

在外部组件CB聚合内部组件CA时,内部组件的非委托未知接口示意如下:

struct INondelegatingUnknown
{
    virtual HRESULT __stdcall NondelegatingQueryInterface(const IID&, void**) = 0;
    virtual ULONG __stdcall NondelegatingAddRef() = 0;
    virtual ULONG __stdcall NondelegatingRelease() = 0;
};

这里,查询函数为NondelegatingQueryInterface。

NondelegatingQueryInterface的实现示意代码如下:

HRESULT __stdcall CA::NondelegatingQueryInterface(const IID& iid, void** ppv)
{
    if (iid == IID_IUnknown)
    {
        *ppv = static_cast<INondelegatingUnknown*>(this);
    }
    else if (iid == IID_IY)
    {
        *ppv = static_cast<IY*>(this);
    }
    .....
}

同时,CA还要实现内部组件的委托未知接口:

ULONG __stdcall CA::QueryInterface(const IID& iid, void** ppv)
{
    return m_pUnknownOuter->QueryInterface(iid, ppv);
}

现在假设外部组件CB实现了接口IX, 内部组件CA实现了组件IY,那么根据上述两本书中的描述,在CB查询IY接口时使用如下代码:

m_pUnknownInner->QueryInterface(IID_IY, ppv);


那么问题来了,通过上述代码来看
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值