如果这是一个愚蠢的问题,我深表歉意,但我不清楚为什么 COM 指针参数通常被转换为 (void**)
而不是 (IUnknown**)
。然后有时实际上会使用 IUnknown
指针,例如 IObjectWithSite::SetSite
。谁能解释一下?
最佳答案
在“get-type”接口(interface)方法中(如IObjectWithSite::QueryInterface
、IObjectWithSite::GetSite
、IMoniker::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/