Должен ли разработчик IShellBrowser :: QueryActiveShellView вызывать метод AddRef для вызывающей стороны? - PullRequest
1 голос
/ 26 октября 2009

Я пытаюсь реализовать IShellBrowser. Один из методов такой:

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

Получает активный указатель вида оболочки для вызывающей стороны (в моем случае, в каждый момент времени существует только один вид оболочки).

Но очень неясно, должен ли я вызывать AddRef от имени вызывающего абонента, или же на самом деле ответственность за вызывающий вызов заключается в том, чтобы сделать свой собственный AddRef / Release?

Я вовсе не фанат программирования побочных эффектов - и это именно то, чем был бы AddRef - скрытое ожидание вызывающей стороны, о котором вызывающая сторона не обязательно будет знать.

И, глядя на документы по IShellBrowser :: QueryActiveShellView, они вообще не упоминают об этом. Но, глядя на IUnknown :: AddRef, мы видим, что любой метод, который создает копию указателя интерфейса, должен вызывать AddRef - http://msdn.microsoft.com/en-us/library/ms691379%28VS.85%29.aspx

Вызывайте этот метод для каждой новой копии указателя интерфейса, который вы делаете. Например, если вы передаете копию указателя обратно из метода, вы должны вызвать AddRef для этого указателя.

Ответы [ 2 ]

3 голосов
/ 26 октября 2009

Да, COM имеет очень подробный контракт на это поведение: все параметры [out] должны быть скопированы (в случае типов значений) или AddRef: ed (в случае указателей на интерфейс).

Итак, вам обязательно нужно добавить AddRef.

0 голосов
/ 27 октября 2009

Это типичная ситуация - вы передаете право владения указателем интерфейса вызывающей стороне. Таким образом, вы вызываете AddRef(), и вызывающий абонент будет вызывать Release(), когда он больше не будет нуждаться в объекте, на который указывает.

...