为什么我需要查询界面?

时间:2016-02-05 12:06:59

标签: c++ com

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

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

1 个答案:

答案 0 :(得分:1)

Microsoft COM 是一种与语言无关的组件技术。 组件是一个单独编译的对象,可能位于不同的进程中,甚至可能位于不同的计算机上。后一种可能性称为 DCOM ,是分布式COM的缩写。

访问组件的COM方式依赖于二进制级别的内存布局,顺便提一下,Visual C ++早期构建多态对象的方式与每个对象中的vtable指针一样。每个COM对象都派生自IUnknown类,它添加了三个虚拟成员函数,即两个用于引用计数,一个用于接口查询。顺便提一下,这也是用于Java Native Interface的布局,并且它在例如Java Native Interface中使用。 XCOM for Unixland。

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