2014-05-10 22 views

回答

1

當您停止線程上的所有COM活動時,可以安全地調用CoUninitialize。留下這樣的COM活動 - 廣義上說,尤其是。留下引用的存根和代理 - 很可能導致未定義的行爲和排序異常。

由於CoInitializeCoUninitialize可以安全地多次調用,您的不成功的CoUninitialize調用可能會根據上下文產生不同的後果。

當你有你的CoUninitialize調用之前線程2+ CoInitialize電話,什麼也不會立即發生,但你將有問題後更接近線程終止時,上層代碼調用它的大概配對CoUninitialize電話終於結束COM初始化。請注意,在這種情況下,您的CoUninitialize不允許您更改單元模式,因爲您的調用不會終止線程上的COM(當您在線程上完全未初始化COM時,只能更改單元模式)。總之,你應該堅持基本原則:你永遠不要自己打電話CoUninitialize。您可以撥打CoInitialize,如果成功,則在完成COM後,必須在線程後面致電CoUninitialize。走出這條道路很可能會讓你陷入困境,這對於快速識別和排除故障來說往往是非常痛苦的。

+0

引用[文檔](https://msdn.microsoft.com/en-us/library/windows/desktop/ms695279(v = vs.85).aspx):「要在線程上優雅地關閉COM庫, **每次成功調用CoInitialize或CoInitializeEx,包括任何返回S_FALSE的調用,都必須通過相應的CoUninitialize調用進行平衡。「 –

相關問題