c++ - 为什么将 COM 指针参数强制转换为 void 而不是 IUnknown?

标签 c++ pointers winapi com iunknown

如果这是一个愚蠢的问题,我深表歉意,但我不清楚为什么 COM 指针参数通常被转换为 (void**) 而不是 (IUnknown**)。然后有时实际上会使用 IUnknown 指针,例如 IObjectWithSite::SetSite。谁能解释一下?

最佳答案

在“get-type”接口(interface)方法中(如IObjectWithSite::QueryInterfaceIObjectWithSite::GetSiteIMoniker::BindToObject 等...),因为它不会改变任何东西,所以无论如何你都必须进行转换,除非你确实需要一个 IUnknown* 引用,但你已经有了它,因为......你是使用它(IUknown* 引用始终是每个 COM rules 的相同指针)。

IObjectWithSite::SetSite 是一种“集合类型”方法,因此给您一个 IUnknown* 引用更有意义。

在像CoCreateInstance这样的一些静态方法中可能更有争议或 CoGetObject我认为他们可以将 IUnknown** 放在那里而不是 void** 但那样的话,他们就会有两种不同的样式。而且您将无法使用旧的 IID_PPV_ARGS非常实用的宏,建议将其作为编码实践以避免类型转换错误。

我建议您从 Don Box 获取权威的“Essential COM”拷贝,并阅读第 60 页(至少 :-)。

关于c++ - 为什么将 COM 指针参数强制转换为 void 而不是 IUnknown?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59440422/

相关文章:

c - 访问释放的指针变量时出现运行时错误

c++ - QWidget::repaint:使用指针检测到递归重绘

windows - 在进程开始之前将 dll 注入(inject)进程的优雅方法

c++ - 来自 PowrProf.h 的 CallNtPowerInformation 的新项目有链接器错误

c# - 带有非导出函数的 DllImport。为什么有效?

c++ - SFML 获取全屏模式

c++ - 使用 C++ 操作 protobuf 中的数据结构

c - 从函数返回 char* 和 char[] 有什么区别?

c++ - qt中有QRect的3D类比吗?

c++ 在一个线程中写入并在第二个线程中读取同一个对象时会发生什么? (安全吗?)