Ha il chiamante ha bisogno di rilasciare l'IShellBrowser * ottenuti tramite la WM_GETISHELLBROWSER non documentato messaggio (WM_USER + 7)?
-
19-09-2019 - |
Domanda
Diversi hanno sottolineato che esiste un messaggio di non documentata che recupera il puntatore di interfaccia IShellBrowser dalla finestra HWND comune per il file aperto e salvare le finestre di dialogo.
Ma ci sono informazioni contrastanti (o nessuna informazione) sul fatto che puntatore è AddRef'd, o se è solo l'indirizzo grezzo restituito, e nessuna Release () dovrebbe essere chiamato su di esso?
Soluzione
No. Si potrebbe trovare il seguente link utile: Le Regole del Component Object Model .
Estratto:
Regole di conteggio dei riferimenti
Regola 1: AddRef deve essere chiamato per ogni nuova copia di un'interfaccia puntatore, e di uscita per ogni chiamata distruzione di un puntatore di interfaccia, tranne regole dove successive esplicitamente permettere altrimenti.
Le seguenti regole chiamano comune nonexceptions alla Regola 1.
- Regola 1 bis: In-Out-parametri alle funzioni. Il chiamante deve AddRef il parametro attuale, dal momento che sarà rilasciato dal chiamato quando l'out-valore è memorizzato su di esso.
- Regola 1b: Scaricare una variabile globale. La copia locale del puntatore recuperato da una copia esistente del puntatore in una variabile globale deve essere indipendente a fare riferimento contato, perché funzioni chiamate potrebbero distruggere la copia in globale, mentre la copia locale è ancora vivo.
- Regola 1c: Nuovi puntatori sintetizzati dal "nulla". Una funzione che sintetizza un puntatore usando conoscenze interne speciale, piuttosto che ottenere da qualche altra fonte, deve fare un AddRef iniziale sul puntatore di nuova sintesi. Esempi importanti di tali procedure includono le routine di creazione istanze, le implementazioni di IUnknown :: QueryInterface e così via.
- Regola 1d: Restituzione di una copia di un puntatore memorizzato internamente. Dopo che il puntatore è stato restituito, il chiamato non ha alcuna idea di come la sua vita si riferisce a quello della copia memorizzata all'interno del puntatore. Così, il chiamato deve chiamare AddRef sulla copia puntatore prima di restituirlo.
Regola 2: conoscenza speciale sulla parte di un pezzo di codice della relazioni degli inizi e le terminazioni delle vite di due o più copie di un puntatore può consentire AddRef / Stampa coppie di essere omessi.
- Dal punto di vista, di conteggio dei riferimenti di un client COM è sempre un concetto per-interfaccia. I clienti non dovrebbero mai assumere che un oggetto utilizza lo stesso conteggio di riferimento per tutte le interfacce.
- I valori di ritorno di AddRef e Release non dovrebbe essere invocata, e dovrebbe essere utilizzato solo per scopi di debug.
- stabilità Pointer; vedi dettagli nel file della Guida OLE in "Regole di conteggio dei riferimenti", sottosezione "Stabilizzare il puntatore this e mantenerlo valido."
Vedere la eccellente "Gestione Oggetto Vite in OLE" articolo tecnico dal Douglas Hodge, e il capitolo 3 del Inside OLE, 2 ° edizione, da Kraig Brockschmidt (MSDN Library, libri) per maggiori informazioni su riferimento conteggio.