Esempio ATL di chiamata (marshalling) interfacce COM con thread di Apartment da un thread di lavoro

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

Domanda

Sto cercando un esempio di codice che illustri come effettuare chiamate COM cross-thread in una DLL ATL COM Server. Ne conosci uno?

Maggiori dettagli:

Il mio componente è un IE Browser Helper Object che deve funzionare su un thread in background. In uno dei metodi del mio oggetto chiamato dal thread principale di IE, IE mi fornisce un puntatore al DOM di IE ( IHtmlWindow2 ) e lo memorizzo in una variabile membro locale.

Ora voglio creare un thread di lavoro che possa chiamare in modo asincrono metodi su quel puntatore all'interfaccia COM che ho appena memorizzato.

Se è importante, le mie chiamate avverranno dopo il ritorno dal metodo in cui ho ottenuto il puntatore all'interfaccia da IE, quindi IE (e non il mio codice) avrà il controllo quando cercherò di effettuare le chiamate dal mio thread di lavoro.

Sia il mio componente che l'applicazione host sono in thread Apartment.

Qualcuno conosce un buon esempio C ++ che mostra come si fa?

Sto cercando specificamente un esempio breve e diretto (e non solo un puntatore alla documentazione pertinente) perché ho letto questa domanda e le sue risposte e sono stato intimidito dalla quantità di apprendimento che avrei dovuto fare per scrivere un'implementazione da zero. Ogni volta che qualcuno consiglia di leggere un libro di Don Box prima di scrivere il codice, sai che passerà una notte lunga e confusa ... :-)

È stato utile?

Soluzione

È automatico in COM, si prende cura dei requisiti degli apartment e effettuerà il marshalling della chiamata se il puntatore all'interfaccia ha affinità STA.È necessario effettuare il marshalling del puntatore all'interfaccia prima di utilizzarlo nel thread, ATL dispone dei metodi di supporto AtlMarshalPtrInProc () e AtlUnmarshalPtr () per semplificare ciò.CoMarshalInterThreadInterfaceInStream () o IGlobalInterfaceTable se vuoi farlo da solo.

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