【发布时间】:2019-10-19 11:38:11
【问题描述】:
在this C++/COM shell 扩展教程中,程序员演示了(出于启发目的)您可以放弃调用QueryInterface() 并简单地传递一个通用对象。至少在实现DllGetClassObject() 时有效。他说QueryInterface() 的目的只是让每个对象自己说明它是否支持给定的接口。
与此同时,Microsoft 似乎 say 认为 QueryInterface() 是获取指向对象上特定接口的指针所必需的。
那么QueryInterface()在多大程度上是必要的?是否有任何时候调用QueryInterface() 是绝对必要的,没有它,代码将无法工作?还是如视频教程所建议的那样,获取对象本身在技术上就足够了?
【问题讨论】:
-
这不是“技术上足够”,它是UB。未定义的行为可能会偶然发生。在 C++ 中需要转换为接口类型,这是 QI 的工作。
-
如果您不能 100% 确定要使用的某个界面是否受支持,这绝对是必不可少的,并且每次都使用它是个好主意。本教程正在教授错误的信息和不正确的编码技术。找一个更好的。
-
在同一个对象上,不同的接口可以有不同的二进制指针。所以调用 QI 是绝对必要的,如果你不知道对象的布局
-
他说 QueryInterface() 的目的只是让每个对象自己说出它是否支持给定的接口。这绝对是错误的。 QI easy 可以返回另一个二进制指针,与它调用的不同:p->QI(iid, &q) 和 (void*)p != (void*)q 可以是
-
@RbMm 我的意思是我说的。被查询的对象可以分配并返回指向内存中完全不同的对象的接口指针。例如,在 ATL 中,使用 tear-off classes。没有要求
QueryInterface()必须为被查询的同一对象返回一个接口,except 当查询的接口是IUnknown时,因为 COM 使用它来进行身份检查。如果查询IUnknown的两个接口返回相同的指针,那么它们是由相同的对象实现的
标签: c++ winapi com shell-extensions queryinterface