c++ - 在 COM 中调用 QueryInterface() 是绝对必要的吗?

标签 c++ winapi com shell-extensions queryinterface

this C++/COM shell 扩展教程,程序员演示(出于启发目的)您可以放弃调用 QueryInterface() 并简单地传递一个通用对象。至少在实现 DllGetClassObject() 时有效。他说 QueryInterface() 的目的只是让每个对象自己说明它是否支持给定的接口(interface)。

与此同时,Microsoft 似乎say QueryInterface() 是获取指向对象上特定接口(interface)的指针所必需的。

那么 QueryInterface() 在多大程度上是必要的?有没有什么时候调用 QueryInterface() 是绝对必要的,没有它代码就无法工作?还是如视频教程所建议的那样,获得对象本身在技术上就足够了?

最佳答案

不,作为一般规则,您不能跳过调用 QueryInterface,除非您知道您拥有的接口(interface)指针已经正确。

如果我们想象一个实现 IFoo 和 IBar 的对象,布局可能看起来像这样:

VT
  IFoo_QueryInterface(...)
  IFoo_AddRef()
  IFoo_Release()
  IFoo_FooFight(int, int)
VT
  IBar_QueryInterface(...)
  IBar_AddRef()
  IBar_Release()
  IBar_BarBarBar(int)

对象的实例可能指向IFoo 的v-table 指针或IBar 的v-table 指针。调用第 4 个方法而不知道它到底是哪个方法会崩溃,因为参数计数不相同。即使签名相同,调用任意方法也不是一个好主意。

您所指的视频只是因为 DllGetClassObject 的调用者通常只要求 IClassFactory 才得以解决。但即使在那里也不安全,因为有人可能会要求 IClassFactory2。因此,正确的 DllGetClassObject 实现也应该调用 QueryInterface

我建议在学习 COM 基础知识时尝试使用 C 而不是 C++ 编写代码,这会迫使您自己处理所有 v 表间接。看看this series了解详情。

关于c++ - 在 COM 中调用 QueryInterface() 是绝对必要的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56435428/

相关文章:

c++ - 使函数返回具有不同属性的东西

c++ - 鼠标移动过多,坐标始终打开

winapi - Windows 8 ARM是否也称为 "Windows RT"是否有第三方开发人员可以使用Winapi(win32)?

C++ WinAPI 保存和打开对话

c++ - '链接错误 : already defined' when using COM interface

c++ - 巧妙破坏的 C++ 代码的邪恶样本

c++ - 尝试从文本文件读取到对象数组

.net - TBBUTTON 结构不适用于 SendMessage

c# - 获取应用于通过 COM 接口(interface)公开的 C# 属性的帮助字符串属性

c++ - 当使用 CreateObject 从 VBScript 通过 COM 引用 C++ DLL 时,如何处理 DLL 版本?