c++ - 如何在 C++ 中实现多个 COM 接口(interface)?

标签 c++ com static-cast multiple-interface-implem

我正在努力理解 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/

相关文章:

c++ - 将无符号解释为有符号

c++ - 来自 C++ 编程语言的排序示例

c++ - 关于static_cast的问题

c++ - 了解 Visual C++ 控制台项目中的 _tmain

c++ - 如何在 C++ 中获取 rdp 客户端 ip?

c++ - 模板矩阵模板

c++ - 实例化 ActiveX 对象

c++ - 设计一个统一返回多个接口(interface)的类

python - 在 swig 接口(interface)中取消引用 boost::shared_ptr 的好方法

php - 在 Office 2010 (Excel.Application) 中使用 PHP 的 COM 对象