我正在尝试实现一个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。
答案 0 :(得分:3)
是的,COM对此行为有一个非常详细的合同:必须复制所有[out]参数(在值类型的情况下)或AddRef:ed(在接口指针的情况下)。
所以,你绝对应该AddRef。
答案 1 :(得分:0)
这是一种典型的情况 - 您将接口指针的所有权传递给调用者。所以你调用AddRef()
,当调用者不再需要指向的对象时,调用者将调用Release()
。