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

最佳答案

在“get-type”接口(interface)方法(例如IObjectWithSite::QueryInterfaceIObjectWithSite::GetSiteIMoniker::BindToObject等)中,因为它不会更改任何内容,所以无论如何都必须进行强制转换,除非您确实需要IUnknown*引用,但是您已经拥有它是因为...您正在使用它(IUknown*引用始终是每个COM rules相同的指针)。
IObjectWithSite::SetSite是“set-type”方法,因此为您提供IUnknown*引用更为有意义。

在某些静态方法(例如CoCreateInstanceCoGetObject)中,这可能更具争议性,我认为他们可以在其中放置IUnknown**而不是void**,但是它们会有两种不同的样式。而且您将无法使用非常实用的旧IID_PPV_ARGS宏,因此建议将其作为编码实践来避免类型转换错误。

我建议您从Don Box那里获得权威的“Essential COM”的副本,并阅读第60页(至少:-)。

09-15 20:47