我對這個檔案感到困惑:
一個執行緒必須為它對CoInitialize或CoInitializeEx函式的每個成功呼叫呼叫一次CoUninitialize,包括任何回傳S_FALSE的呼叫。只有與初始化庫的CoInitialize或CoInitializeEx呼叫相對應的CoUnitialize呼叫才能關閉它。
這聽起來像是在說對CoInitialize/Ex()的成功呼叫包括那些回傳S_FALSE的呼叫?
或者,CoUninitialize()必須在CoInitialize/Ex()回傳S_OK時才被呼叫?
或者,不管回傳值是多少,都應該呼叫它?
uj5u.com熱心網友回復:
根據檔案:
一個執行緒必須為它對
CoInitialize或CoInitializeEx函式的每個成功的呼叫CoUninitialize一次,包括任何回傳S_FALSE的呼叫。 只有對應于初始化庫的CoInitialize或CoInitializeEx呼叫的CoUninitialize才可以關閉它。
一般來說,COM庫在一個執行緒上只被初始化一次。在同一執行緒上對 CoInitialize 或 CoInitializeEx 的后續呼叫將會成功,只要它們不試圖改變并發模型,但會回傳 S_FALSE。為了優雅地關閉 COM 庫,對 CoInitialize 或 CoInitializeEx 的每次成功呼叫,包括回傳 S_FALSE 的呼叫,必須通過對 CoUninitialize 的相應呼叫來平衡。然而,應用程式中第一個以0呼叫CoInitialize(或以COINIT_APARTMENTTHREADED呼叫CoInitializeEx)的執行緒必須是最后呼叫CoUninitialize的執行緒。否則,STA上后續的CoInitialize呼叫將失敗,應用程式將無法作業。
。CoInitializeEx必須至少被呼叫一次,而且通常只被呼叫一次,用于使用COM庫的每個執行緒。同一個執行緒對 CoInitializeEx 的多次呼叫是允許的,只要它們傳遞相同的并發標志,但隨后的有效呼叫會回傳 S_FALSE。為了在一個執行緒上優雅地關閉 COM 庫,對 CoInitialize 或 CoInitializeEx 的每次成功呼叫,包括任何回傳 S_FALSE 的呼叫,必須由對 CoUninitialize 的相應呼叫來平衡。
所有前綴為 "E_"的常數都是錯誤代碼。常量
。S_OK和S_FALSE都是成功代碼。大概99%的COM方法在成功時回傳S_OK;但是不要讓這個事實誤導了你。一個方法可能會回傳其他的成功代碼,所以一定要通過使用SUCCEED或FAILED宏來測驗錯誤......
成功代碼
S_FALSE值得一提。一些方法使用S_FALSE來表示,大致上,一個不是失敗的負面條件。它也可以表示一個 "no-op"--方法成功了,但沒有效果。例如,如果你從同一個執行緒第二次呼叫CoInitializeEx函式,它將回傳S_FALSE。如果你需要在你的代碼中區分S_OK和S_FALSE,你應該直接測驗該值,但仍然使用FAILED或SUCCEED來處理其余情況...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/331302.html
標籤:
上一篇:如何根據資料框的值更改邊緣顏色
