CoInitialize CoInitializeEx 是用來初始化COM運行環境的。
OleInitialize是初始化Ole的運行環境,Ole是在Com的基礎上作的擴展,是ActiveX運行的基礎,OleInitialize肯定會調用CoInitialize。
CoInitialize、CoInitializeEx都是windows的API,主要是告訴windows以什麼方式爲程序創建COM對象,原因是程序調用com庫函數(除CoGetMalloc和內存分配函數)之前必須初始化com庫。
CoInitialize指明以單線程方式創建。
CoInitializeEx可以指定COINIT_MULTITHREADED以多線程方式創建。
創建單線程方式的COM服務器時不用考慮串行化問題,多線程COM服務器就要考慮。
CoInitialize並不裝載com庫,這個函數只是用來初始化當前線程使用什麼樣的套間。當使用這個函數以後,線程就和一個套間建立了對應關係。
線程的套間模式決定了該線程如何調用com對象,是否需要列集等
套間是com中用來解決併發調用衝突的很有效的辦法
Before calling any COM functions, a thread needs to call CoInitialize to load the COM infrastructure (and to enter an apartment). Once a thread calls CoInitialize, the thread is free to call COM APIs.
CoInitializeEx provides the same functionality as CoInitialize and also provides a parameter to explicitly specify the thread's concurrency model. The current implementation of CoInitialize calls CoInitializeEx and specifies
the concurrency model as single-thread apartment. Applications developed today should call CoInitializeEx rather than CoInitialize.
注:新的應用程序應該調用CoInitializeEx而不是CoInitialize,否則就會有必要在之後每個調用Com的線程中調用CoInitialize來初始化出每個線程自己的套間。
AfxOleInit實際上調用了OleInitialize,雖然它在內部也調用了CoInitializeEx,但它只能處理單線程,這是AfxOleInit和CoInitialize主要區別:
OleInitialize calls CoInitializeEx internally to initialize the COM library on the current apartment. Because OLE operations are not thread-safe, OleInitialize specifies the
concurrency model as single-thread apartment.
Once the concurrency model for an apartment is set, it cannot be changed. A call to OleInitialize on an apartment that was previously initialized as multithreaded will
fail and return RPC_E_CHANGED_MODE.
應用:
1. CoInitialize 僅僅初始化Com,支持多線程。也就是說如果多線程調用Com接口,必須在每個線程中都調用CoInitialize。
2. OleInitialize 初始化Com(其實也是調用CoInitializeEx),支持多線程。比CoInitialize多了一下內容:
A) Clipboard
B) Drag and drop
C) Object linking and embedding (OLE)
D) In-place activation
如果不需要這些,用CoInitialize就可以。
3. AfxOleInit是MFC對OleInitialize的封裝。貌似不支持多線程,也就是說只能在主進程調用該函數,如果線程需要使用Com必須調用上面的兩個來實現初始化。而且MSDN明確標明AfxOleInit不能在MFC的DLL中調用,否則也會造成初始化失敗。
4.OleInitialize和OleUninitialize( )成對使用;CoInitialize和CoUninitialize成對使用;CoInitializeEx和CoUninitialize成對使用;AfxOleInit()由MFC自動釋放。
VC++使用ADO訪問ACCESS時,出現_RecordsetPtr Open卡或者_ConnectionPtr Excute卡或者_CommandPtr Excute一直卡住等莫名其妙的情況時,而語法又沒有錯誤時,請確定初始化COM函數。
MFC程序建議使用AfxOleInit()。