1. 程式人生 > >多執行緒中使用COM元件時的初始化問題

多執行緒中使用COM元件時的初始化問題

        CoInitialize、CoInitializeEx都是windows的API,主要是告訴windows以什麼方式為程式建立COM物件,原因是程式呼叫com庫函式(除CoGetMalloc和記憶體分配函式)之前必須初始化com庫。
       有哪些方式呢?單執行緒和多執行緒。
       CoInitialize指明以單執行緒方式建立。
       CoInitializeEx可以指定COINIT_MULTITHREADED以多執行緒方式建立。
       建立單執行緒方式的COM伺服器時不用考慮序列化問題,多執行緒COM伺服器就要考慮。
       在使用中,使用CoInitialize建立可使物件直接與執行緒連線,得到最高的效能。建立多執行緒物件可以直接接收所有執行緒的呼叫,不必像單執行緒那樣需要訊息排隊,但卻需要COM建立執行緒間彙集代理,這樣訪問效率不高。

       如果一個程序內有多個執行緒,只有某個執行緒需要呼叫COM庫,那麼這個執行緒就需要呼叫Coinitialze進行初始化。CoInitialize告訴COM將當前的執行緒加入到某一個執行緒套間。
       關於執行緒套間的詳細內容可以查詢COM的相關資料。
       跨不同的執行緒套間有可能需要用存根和代理進行呼叫,而不能進行直接呼叫。COM庫根據執行緒套間的相容性來判斷是否可以直接呼叫,還是需要通過存根和代理進行呼叫。因此,每個執行緒如果使用COM庫,都需要預先宣告加入某一個執行緒套間,這樣COM庫才知道如何才能決定是直接呼叫還是通過列集和散集呼叫。

      CoInitialize每個使用的執行緒都要呼叫一次,而如果用CoInitializeEx的第二個引數指明COINIT_MULTITHREADED,那就不需要了。