我目前正在学习组件对象模型(COM),发现自己对接口有点困惑。有几个问题:
1.- 指向类的指针和指向接口的指针有什么区别吗?
2.- 为什么我们要通过指向接口的指针来访问接口,而不是直接通过接口的实例?
3.- 在 IUnknown - Win32 应用程序中Microsoft Learn 有一些关于
IUnknown::QueryInterface
的文档。 ppvObject
中存储了什么?如果我们取消引用 ppvObject
,只要接口是由调用对象实现的,我们是否应该总是获得与我们用来调用 QueryInterface
的指针相同的指针,独立于我们正在查询的接口?
例如,如果我们运行
pMyObject->QueryInterface(SomeRIID, &pvObject);
,那么 pvObject
将等于 pMyObject
,只要 pMyObject
是指向实现与 SomeRIID
关联的接口的类的指针?
interface
的引用。此处使用的“类”一词与 C++ 语言绑定。如何获取接口引用(如果对象实现是 C++,则可能从 C++ 类获取)是无关紧要的。有些接口是从coclass
获取的,其他接口是从方法调用获取的,包括QueryInterface
。一般来说,我们在 IDL 文件中描述接口和组件类正是因为它与语言无关。
参见 1。如果“接口实例”指的是所有这一切背后的 C++ vtable/struct,那么又是因为它与语言无关。但您确实会在该指针后面得到一个“COM vtable”,因为 COM 接口是一个二进制契约。该二进制合约是一个定义的有序方法列表,其中每个方法都有定义的方法签名(参数类型和返回类型)。
备注部分应包含您想了解的所有内容:
对于任何给定的 COM 对象 [...],一个特定的 查询任何对象接口上的
接口 必须始终返回相同的指针值。这使得客户能够 通过调用确定两个指针是否指向同一个组件IUnknown
与QueryInterface
并比较结果。IID_IUnknown
查询除以下接口以外的接口时,具体情况并非如此
(即使是通过同一个指针的同一个接口)也必须 返回相同的指针值。IUnknown
PS:好的,Win32 COM 对象布局与 C++ 对象布局紧密匹配并非巧合。...