抱歉,这是一个愚蠢的问题,但是我不清楚为什么COM指针参数通常转换为(void**)
而不是(IUnknown**)
。然后有时实际上会使用IUnknown
指针,就像IObjectWithSite::SetSite
一样。谁能解释一下?
最佳答案
在“get-type”接口(interface)方法(例如IObjectWithSite::QueryInterface
,IObjectWithSite::GetSite
,IMoniker::BindToObject
等)中,因为它不会更改任何内容,所以无论如何都必须进行强制转换,除非您确实需要IUnknown*
引用,但是您已经拥有它是因为...您正在使用它(IUknown*
引用始终是每个COM rules相同的指针)。IObjectWithSite::SetSite
是“set-type”方法,因此为您提供IUnknown*
引用更为有意义。
在某些静态方法(例如CoCreateInstance或CoGetObject)中,这可能更具争议性,我认为他们可以在其中放置IUnknown**
而不是void**
,但是它们会有两种不同的样式。而且您将无法使用非常实用的旧IID_PPV_ARGS宏,因此建议将其作为编码实践来避免类型转换错误。
我建议您从Don Box那里获得权威的“Essential COM”的副本,并阅读第60页(至少:-)。