为什么需要查询接口?

Why do I need to query interface?

在我问的问题中:What does ComPtr.As() do?

我发现 As() 方法查询接口,但为什么我需要这样做?查询接口有什么意义?

Microsoft 的 COM 是一种与语言无关的 component 技术。 component 是一个单独编译的对象,它可能驻留在不同的进程中,甚至可能驻留在不同的计算机上。后一种可能性称为 DCOM,Distributed COM 的缩写。

访问组件的 COM 方式依赖于二进制级别的内存布局,顺便说一句,这正是早期 Visual C++ 布局多态对象的方式,每个对象中首先有一个 vtable 指针。每个COM对象都派生自IUnknown class,它增加了三个虚拟成员函数,两个用于引用计数,一个用于接口查询。顺便说一下,这也是用于 Java 本机界面的布局,例如用于适用于 Unixland 的 XCOM。

COM 设计者认为实现继承 不好,因此每个对象都提供一个或多个不同的纯接口、虚拟集合方法。要为给定对象获取指向给定接口的指针,在最低级别,您将 128 位统计唯一接口标识符传递给查询接口的 IUnknown 接口方法。请记住,虽然 COM 的二进制级布局是为 C++ 设计的,但该技术本身并不是特别适合 C++:它与语言无关,因此您必须在 运行 时间查询接口,而不是拥有那些接口作为对象的 C++ 类型的一部分。