2015-12-17 7 views
5

C'è sempre un motivo per utilizzare CoInitialize nella mia funzione DLL quando si utilizza IXMLDocument (wrapper msxml)? (o Altro oggetto com relativo)L'utilizzo di IXMLDocument in una DLL richiede CoInitialize?

L'applicazione/thread chiamante è responsabile della chiamata CoInitialize/CoUninitialize?

Cosa succede se utilizzo ComObj nella DLL che chiama automaticamente CoInitialize nella relativa sezione di inizializzazione e CoUninitialize nella sua sezione di finalizzazione?

risposta

8

L'applicazione/il thread chiamante è responsabile della chiamata di CoInitialize/CoUninitialize?

Sì. Come regola generale, il creatore di un thread deve essere responsabile dell'inizializzazione di COM. Ciò significa che le funzioni che esponi dalla DLL non dovrebbero inizializzare COM per il thread su cui sono stati chiamati.

La ragione è che se ci si prende la responsabilità di inizializzare COM nel thread che chiama la DLL, allora si pone un vincolo irragionevole sul creatore di quel thread. Cosa succede se il creatore del thread deve eseguire un'altra azione che richiede l'inizializzazione di COM? La pratica standard è che la DLL specifica l'inizializzazione COM come uno dei suoi requisiti. Nella documentazione per la DLL, indicare che il chiamante deve inizializzare COM.

Maggiori dettagli qui: Things you shouldn't do, part 2: Dlls can't ever call CoInitialize* on the application’s thread.

Ecco perché non dovresti inizializzare COM nella tua DLL sul thread del chiamante. C'è ancora più motivo per non inizializzare COM in una sezione di inizializzazione. Le sezioni di inizializzazione sono eseguite all'interno della DLL DllMain. Ci sono pochissime cose che è permesso chiamare all'interno di DllMain, le funzioni COM non sono nella lista delle azioni consentite. Per maggiori dettagli: Some reasons not to do anything scary in your DllMain, part 3.

Cosa succede se utilizzo ComObj nella DLL che chiama automaticamente CoInitialize nella sezione di inizializzazione e CoUninitialize nella sezione di finalizzazione?

L'unità ComObj non lo fa. Per una DLL, il codice di inizializzazione COM a cui si fa riferimento è soppresso. Includendo ComObj si forza l'inizializzazione di COM in un progetto eseguibile, ma non in una libreria.

+0

E se una delle unità utilizzate dalla DLL o dalla DLL stessa utilizza indirettamente l'unità "ComObj"? Come dovrei affrontarlo se esiste? – zig

+1

La regola più generale qui è: COM dovrebbe essere inizializzata solo dal creatore/proprietario di un thread. Se la DLL crea i propri thread per eseguire operazioni COM, è responsabile dell'inizializzazione di COM su tali thread. – IInspectable

+0

@zig Beh, e se? Non c'è nessun problema. Il chiamante inizializza COM, come indicato. E la tua DLL va bene per usare le funzioni in 'ComObj'. L'uso di 'ComObj' in una DLL non causa l'inizializzazione di COM. Ciò accade solo in un'app GUI. –

Problemi correlati