尝试理解 C++ 中的接口指针和 IUnknown::QueryInterface

问题描述 投票:0回答:1

我目前正在学习组件对象模型(COM),发现自己对接口有点困惑。有几个问题:

1.- 指向类的指针和指向接口的指针有什么区别吗?

2.- 为什么我们要通过指向接口的指针来访问接口,而不是直接通过接口的实例?

3.- 在 IUnknown - Win32 应用程序中Microsoft Learn 有一些关于

IUnknown::QueryInterface
的文档。
ppvObject
中存储了什么?如果我们取消引用
ppvObject
,只要接口是由调用对象实现的,我们是否应该总是获得与我们用来调用
QueryInterface
的指针相同的指针,独立于我们正在查询的接口?

例如,如果我们运行

pMyObject->QueryInterface(SomeRIID, &pvObject);
,那么
pvObject
将等于
pMyObject
,只要
pMyObject
是指向实现与
SomeRIID
关联的接口的类的指针?

c++ pointers com
1个回答
0
投票
  1. COM 与语言无关,因此我们总是获得对 COM

    interface
    的引用。此处使用的“类”一词与 C++ 语言绑定。如何获取接口引用(如果对象实现是 C++,则可能从 C++ 类获取)是无关紧要的。有些接口是从
    coclass
    获取的,其他接口是从方法调用获取的,包括
    QueryInterface
    。一般来说,我们在 IDL 文件中描述接口和组件类正是因为它与语言无关。

  2. 参见 1。如果“接口实例”指的是所有这一切背后的 C++ vtable/struct,那么又是因为它与语言无关。但您确实会在该指针后面得到一个“COM vtable”,因为 COM 接口是一个二进制契约。该二进制合约是一个定义的有序方法列表,其中每个方法都有定义的方法签名(参数类型和返回类型)。

  3. 备注部分应包含您想了解的所有内容:

对于任何给定的 COM 对象 [...],一个特定的 查询任何对象接口上的

IUnknown
接口 必须始终返回相同的指针值。这使得客户能够 通过调用确定两个指针是否指向同一个组件
QueryInterface
IID_IUnknown
并比较结果。

查询除以下接口以外的接口时,具体情况并非如此

IUnknown
(即使是通过同一个指针的同一个接口)也必须 返回相同的指针值。

PS:好的,Win32 COM 对象布局与 C++ 对象布局紧密匹配并非巧合。...

© www.soinside.com 2019 - 2024. All rights reserved.