2011-11-08 7 views
7

mogę wykonywać połączenia do CoInitializeEx, a konkretnie:Czy ważne jest, aby wywołać CoUninitialize w wątku, który zostanie zakończony przed zakończeniem mojej aplikacji?

CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED); 

w wątkach, że moja aplikacja tworzy, ale wtedy zakończy się przed zjazdami aplikacyjnych. Czy jest ważne, aby powiązać je z wywołaniami CoUninitialize, lub czy te zasoby zostaną zwolnione po zakończeniu wątków?

+1

Nawet jeśli nie jest to ważne, dlaczego nie chcesz ich sparować? –

+0

Ponieważ kod jest już w fazie testowania, a wolałbym go nie zmieniać, jeśli zmiana jest nieistotna, ale punkt jest zajęty. – jeffm

Odpowiedz

14

Zasoby są zwykle zwracane do systemu po zakończeniu procesu, a nie wtedy, gdy działa jeden z jego wątków.

Jednakże, CoUninitialize() nie tylko uwalnia zasoby i zwalnia biblioteki DLL, ale także wprowadza modalną pętlę komunikatów, aby pompować pozostałe komunikaty COM przed zakończeniem wątku. Dokumentacja mówi:

Jeśli istnieją otwarte rozmowy pozostałe, CoUninitialize zaczyna wiadomość pętlę modalne i wywołuje żadnych oczekujących wiadomości z pojemnikach lub serwera dla tej aplikacji COM. Wysyłając komunikaty , zapewnia, że ​​aplikacja nie opuści przed otrzymaniem wszystkich oczekujących wiadomości. Komunikaty inne niż COM są odrzucane.

Dlatego też, w celu uniknięcia błędów RPC po stronie rozmówcy, polecam śledzić porady dokumentacji i zawsze zadzwonić CoUninitialize() przed zakończeniem wątki, które zwane CoInitializeEx().

Powiązane problemy