代码之家  ›  专栏  ›  技术社区  ›  Martin

如何实现多个COM接口在C++中工作?

  •  5
  • Martin  · 技术社区  · 16 年前

    我试着理解 this example code 关于浏览器帮助器对象。

    在内部,作者实现了一个公开多个接口的类(IObjectWithSite、IDispatch)。

    其queryinterface函数执行以下操作:

    if(riid == IID_IUnknown) *ppv = static_cast<BHO*>(this);
    else if(riid == IID_IObjectWithSite) *ppv = static_cast<IObjectWithSite*>(this);
    else if (riid == IID_IDispatch) *ppv = static_cast<IDispatch*>(this);
    

    我从C的角度了解到,接口指针只是指向vtables的指针。因此,我认为C++能够使用StasyType强制返回任何实现的接口的VTABLE。

    这是否意味着以这种方式构建的类在内存中有一堆vtables(iobjectwithsite、idispatch等)?C++在不同的接口上用名字做冲突(它们每个都有Que界面,AddiRf和释放函数),我能为每个实现不同的方法吗?

    2 回复  |  直到 14 年前
        1
  •  6
  •   Hans Passant    14 年前

    是的,有多个V表,每个继承接口一个。静态\u cast<gt;返回它。编译器确保继承接口中的公共方法是共享的,它用指向同一函数的指针填充每个v表槽。所以您只需要一个addref、release和queryinterface的实现。只是你想要的。这些都不是意外。

    只有当一个组件类使用与您相同的方法实现多个接口时,这才是一个问题。 不要 希望给出相同的实现。IConnectionPoint::Advise()方法是一个臭名昭著的例子。或者是Dadvise()?不幸的是,我不记得它与什么冲突,以及它是如何解决的,它被ATL内部所覆盖。非常好的书。

        2
  •  3
  •   YeenFei    16 年前

    在多重继承中,如果给定,多个vtable按如下格式的顺序排列 this 指针(指向第一个字节,01)

    【01】【02】【03】【04】【05】【06】【07】【08】【09】【10】【11】【12】
    [vtablea的指针][vtableb的指针][vtablec的指针]

    在C++中,在多个接口场景中,每个函数原型只生成1个实现。 然而,对于正常的继承场景,超类可能有预先定义的实现,并且覆盖函数的子类的vtables指向的内容与父类不同。

    推荐文章