1

我正在尝试实现 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。

4

2 回答 2

3

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

所以,你绝对应该 AddRef。

于 2009-10-26T17:36:02.403 回答
0

这是一种典型的情况——您将接口指针的所有权传递给调用者。因此,您调用AddRef()并且调用者将Release()在不再需要指向的对象时调用。

于 2009-10-27T06:24:40.760 回答