OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()區別

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()。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章