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

C++ 在C+中实现多个COM接口是如何工作的+;?,c++,com,static-cast,multiple-interface-implem,C++,Com,Static Cast,Multiple Interface Implem,我试图了解有关浏览器辅助对象的信息 在内部,作者实现了一个公开多个接口的类(IObjectWithSite、IDispatch) 他的QueryInterface函数执行以下操作: if(riid == IID_IUnknown) *ppv = static_cast<BHO*>(this); else if(riid == IID_IObjectWithSite) *ppv = static_cast<IObjectWithSite*>(this); else if (

我试图了解有关浏览器辅助对象的信息

在内部,作者实现了一个公开多个接口的类(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);
if(riid==IID\u IUnknown)*ppv=static\u cast(this);
否则,如果(riid==IID\U IOBJECTWITHISTE)*ppv=static\U cast(本);
否则,如果(riid==IID_IDispatch)*ppv=static_cast(本);
我已经了解到,从C的角度来看,接口指针只是指向VTables的指针。因此,我认为C++能够使用STATICO.CAST.

返回任何实现的接口的VTALE。
这是否意味着以这种方式构造的类在内存中有一堆vtable(IObjectWithSite、IDispatch等)?C++在不同的接口上用名字做冲突(它们每个有Que界面、AddiRf和释放函数),我能为这些实现不同的方法吗?< /P> < P>是的,有多个V表,每个继承的接口都有一个。静态_cast返回它。编译器确保继承接口中的公共方法是共享的,它用指向同一函数的指针填充每个v-table插槽。因此,您只需要一个AddRef、Release、QueryInterface的实现。正是你想要的。这一切都不是意外


只有当一个coclass使用同一方法实现了多个接口,而您不想给出相同的实现时,这才是一个问题。IConnectionPoint::advice()方法就是一个臭名昭著的例子。还是DAdvise()?不幸的是,我不记得它与什么冲突以及它是如何解决的,它被ATL内部所覆盖。非常好的书,顺便说一句。

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

[01][02][03][04][05][06][07][08][09][10][11][12]
[VTableA的Ptr][VTableB的Ptr][VTableC的Ptr]

在C++中,在多个接口场景中,每个函数原型只生成1个实现。
但是,对于正常的继承场景,超类可能有预定义的实现,重写该函数的子类的VTables将指向与父类不同的内容。

谢谢!我自己也读过一些书,发现它不仅创建了不同的vtable,还创建了“thunk”函数来修复指针,然后再重定向回公共函数。