我正在努力理解 this example code关于浏览器帮助对象。
在内部,作者实现了一个公开多个接口(interface)(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 的角度来看,接口(interface)指针只是指向 VTable 的指针。所以我认为这意味着 C++ 能够使用 static_cast 返回任何已实现接口(interface)的 VTable。
这是否意味着以这种方式构建的类在内存中有一堆 VTable(IObjectWithSite、IDispatch 等)? C++ 如何处理不同接口(interface)上的名称冲突(它们每个都有一个 QueryInterface、AddRef 和 Release 函数),我可以为每个接口(interface)实现不同的方法吗?
最佳答案
是的,有多个 v 表,每个继承的接口(interface)一个。 static_cast<> 返回它。编译器确保继承接口(interface)中的公共(public)方法是共享的,它用指向相同函数的指针填充每个 v-table 槽。所以你只需要 AddRef、Release、QueryInterface 的一个实现。就是你想要的。这一切都不是意外。
只有当 coclass 使用您不想希望提供相同实现的相同方法实现多个接口(interface)时,这才会成为问题。 IConnectionPoint::Advise() 方法是一个臭名昭著的例子。还是 DAdvise()?不幸的是,我不记得它与什么发生冲突以及它是如何解决的,ATL Internals 涵盖了它。非常好的书。
关于c++ - 如何在 C++ 中实现多个 COM 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3034285/