Un implementatore del metodo IShellBrowser :: QueryActiveShellView deve chiamare AddRef per il chiamante?
-
06-07-2019 - |
Domanda
Sto tentando di implementare un IShellBrowser. Un metodo di questo è:
HRESULT STDMETHODCALLTYPE IShellBrowser::QueryActiveShellView(/* [out] */ __RPC__deref_out_opt IShellView **ppshv)
Questo ottiene il puntatore della vista shell attiva per il chiamante (nel mio caso, c'è una sola vista shell alla volta).
Ma non è chiaro se dovrei chiamare AddRef per conto del chiamante o se in effetti è responsabilità del chiamante fare il proprio AddRef / Release?
Non sono affatto un fan della programmazione per effetto collaterale - ed è esattamente quello che AddRef sarebbe - un'aspettativa nascosta sul chiamante, che il chiamante non necessariamente conoscerebbe.
E guardando i documenti per IShellBrowser :: QueryActiveShellView, non ne parlano affatto. Ma guardando IUnnown :: AddRef, vediamo che qualsiasi metodo che crea una copia di un puntatore a interfaccia dovrebbe chiamare AddRef - http://msdn.microsoft.com/en-us/library/ms691379%28VS.85%29.aspx
Chiama questo metodo per ogni nuova copia di un puntatore all'interfaccia che crei. Ad esempio, se si passa una copia di un puntatore indietro da un metodo, è necessario chiamare AddRef su quel puntatore.
Soluzione
Sì, COM ha un contratto molto dettagliato su questo comportamento: tutti i parametri [out] devono essere copiati (nel caso dei tipi di valore) o AddRef: ed (nel caso dei puntatori all'interfaccia).
Quindi, dovresti assolutamente aggiungere AddRef.
Altri suggerimenti
È una situazione tipica: si passa la proprietà del puntatore all'interfaccia al chiamante. Quindi chiamate AddRef ()
e il chiamante chiamerà Release ()
quando non ha più bisogno dell'oggetto puntato.