2011-11-08 8 views
7

Mi effettuare chiamate a CoInitializeEx, in particolare:È importante chiamare CoUninitialize su un thread che verrà terminato prima della chiusura dell'applicazione?

CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED); 

In discussioni che la mia applicazione crea, ma poi si conclude prima della chiusura dell'applicazione. È importante accoppiarli con le chiamate CoUninitialize o liberare tali risorse quando i thread terminano?

+1

Anche se non è importante farlo, perché non li accoppi? –

+0

Perché il codice è già in fase di test, e preferirei non cambiarlo se la modifica è irrilevante, ma il punto è preso. – jeffm

risposta

14

Le risorse di solito vengono restituite al sistema quando il processo termina, non quando uno dei suoi thread lo fa.

Tuttavia, CoUninitialize() non solo libera risorse e scarica DLL, ma immette anche un ciclo di messaggi modali per pompare i restanti messaggi COM prima che il thread termini. La documentazione dice:

Se non ci sono le conversazioni aperte rimanenti, CoUninitialize inizia un ciclo di messaggi modale e invia messaggi in sospeso dalle contenitori o del server per questa applicazione COM. Inviando i messaggi , CoUninitialize assicura che l'applicazione non esca prima di ricevere tutti i messaggi in sospeso. I messaggi non COM sono scartati .

Pertanto, al fine di evitare errori RPC dalla parte dei chiamanti, vi consiglio di seguire i consigli del documentazione e chiami sempre CoUninitialize() prima di terminare le discussioni che hanno chiamato CoInitializeEx().

Problemi correlati