2010-01-28 185 views
0

我有一個使用COM對象的單線程應用程序。在開始時,我實際上調用CoInitialize(0)兩次 - 一次在我的代碼中,第二次在應用程序的另一個子系統的代碼中調用。第一個調用返回S_OK,第二個返回S_FALSE - 正如MSDN所說的那樣。CoInitialize()/ CoUninitialize()調用配對

當應用程序停止它調用CoUninitialize()兩次,但在這些調用之間,它試圖調用一些COM對象的方法 - 這些調用只是因訪問衝突而崩潰,因爲我認爲COM對象在第一次調用CoUnitialize()時被完成並釋放。如果我刪除重複呼叫CoInitialize()/CoUnitialize()它的作品沒問題。

但這是爲什麼呢? MSDN表示我可以重複呼叫CoInitialize(),並且只能將這些呼叫與匹配號碼CoUnitialize()呼叫配對。

爲什麼COM對象在第一次調用CoUninitialize()時完成。

+0

出於好奇,你爲什麼要*按照你實施的方式工作 - 爲什麼不是一對? – Ruddy 2010-01-28 11:59:03

+0

其他子系統有時被其他程序使用,要求他們調用CoInitialize()會很醜陋,因此子系統在創建它將使用的第一個COM對象之前自己調用它。 – sharptooth 2010-01-28 12:03:58

+0

我不能說*爲什麼*它不會工作,但我已經看到類似的問題,總是回到只有一個CoUninitialize - 毫無疑問,你已經考慮過(作爲一個黑客解決方法)保持跟蹤CoInitialize返回S_FALSE而不調用CoUnitialize。 – Ruddy 2010-01-28 12:20:56

回答

0

聽起來像你正在做的是正確的,但是,請檢查以確保您的couninitialize調用是在應用程序的主窗口已關閉並且該窗口的消息循環已完成後完成的。

+0

實際上,第一次調用是在循環運行時完成的。 – sharptooth 2010-01-28 11:51:57

+0

你可以在循環之外移動它嗎?這可能有幫助。 – 2010-01-28 13:42:11

+0

其實這並不容易。爲什麼它首先重要? – sharptooth 2010-01-28 13:43:07

相關問題