1

IShellBrowser を実装しようとしています。そのような方法の1つは次のとおりです。

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

これにより、呼び出し元のアクティブなシェル ビュー ポインターが取得されます (私の場合、常に 1 つのシェル ビューしかありません)。

しかし、呼び出し元に代わって 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 に答える