【发布时间】:2020-04-13 20:42:40
【问题描述】:
抱歉,如果这是一个愚蠢的问题,但我不清楚为什么 COM 指针参数通常被转换为 (void**) 而不是 (IUnknown**)。然后有时实际上使用了IUnknown 指针,例如IObjectWithSite::SetSite。谁能解释一下?
【问题讨论】:
-
TLDR:旧版。因为 COM 也适用于 C,而不仅仅是 C++。
-
@selbie 如果这真的是你理解的原因,你应该把它作为一个答案。
-
声明多态接口指针的能力只存在于C++中。 COM 运行时 api(CoCreateInstance 等)是 C api,因此需要 C 类型。别无选择,只能作废*。实际上,在 C 中编写 OLE 是非常不切实际的,因此在 IObjectWithSite 等接口中使用 IUnknown* 是可行的。
-
@han:大部分是正确的,但是您将
[in]和[out]参数混为一谈。后者需要多态接口指针,因此void*是给定 C ABI 的唯一选项。然而,在前一种情况下,接口需要IUnknown*,而不是某种多态(在语言级别的意义上)接口指针。这与实用性无关。这是关于正确性。
标签: c++ pointers winapi com iunknown