Важно ли вызывать CoUninitialize для потока, который будет прерван до завершения моего приложения? - PullRequest
7 голосов
/ 08 ноября 2011

Я звоню в CoInitializeEx, а именно:

CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED);

В потоках, которые мое приложение создает, но затем завершает работу до выхода из приложения. Важно ли связывать их с вызовами CoUninitialize или эти ресурсы освобождаются после завершения потоков?

1 Ответ

14 голосов
/ 08 ноября 2011

Ресурсы обычно возвращаются в систему, когда процесс завершается, а не когда один из его потоков.

Тем не менее, CoUninitialize () не только освобождает ресурсы и выгружает библиотеки DLL, но также входит в модальный цикл обработки сообщений для прокачки оставшихся сообщений COM до завершения потока. В документации написано:

Если остаются открытые разговоры, CoUninitialize запускает модальный цикл сообщений и отправляет все ожидающие сообщения от контейнеры или сервер для этого приложения COM. Отправляя CoUninitialize гарантирует, что приложение не закроется до получения всех ожидающих сообщений. Не COM-сообщения отбрасывают. * * 1 010

Поэтому, чтобы избежать ошибок RPC на стороне вызывающих, я бы рекомендовал вам следовать советам документации и всегда вызывать CoUninitialize() перед завершением потоков, которые вызвали CoInitializeEx().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...