Я пытаюсь реализовать 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 для этого указателя.