我正在尝试实现一个IShellBrowser。一种方法是:

HRESULT STDMETHODCALLTYPE IShellBrowser::QueryActiveShellView(/* [out] */ __RPC__deref_out_opt IShellView **ppshv)

这将获得调用者的活动shell视图指针(在我的情况下,在任何给定时间只有一个shell视图)。

但是我不清楚是否应该代表调用者调用AddRef,或者实际上调用者是否有责任自己执行AddRef / Release?

我根本不是编程旁边效果的粉丝 - 而这正是AddRef会是什么 - 对来电者隐藏的期望,来电者不一定知道。

在查看IShellBrowser :: QueryActiveShellView的文档时,他们根本没有提到它。但是看看IUnknown :: AddRef,我们看到任何制作接口指针副本的方法都应该调用AddRef - http://msdn.microsoft.com/en-us/library/ms691379%28VS.85%29.aspx

  

为您创建的接口指针的每个新副本调用此方法。例如,如果要从方法传回指针的副本,则必须在该指针上调用AddRef。

有帮助吗?

解决方案

是的,COM对此行为有一个非常详细的合同:必须复制所有[out]参数(在值类型的情况下)或AddRef:ed(在接口指针的情况下)。

所以,你绝对应该AddRef。

其他提示

这是一种典型的情况 - 您将接口指针的所有权传递给调用者。所以你调用 AddRef(),当调用者不再需要指向的对象时,调用者将调用 Release()

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top