Un implementatore del metodo IShellBrowser :: QueryActiveShellView deve chiamare AddRef per il chiamante?

StackOverflow https://stackoverflow.com/questions/1626038

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top