Delphi中CoInitialize之探究

Delphi中CoInitialize之探究

Delphi 2009-08-05 09:21:59 閱讀387 評論0 字號:
       CoInitialize(LPVOID),它將以特定參數調用CoInitializeEx,爲當前單元初始化COM庫,並標記協同模式爲單線程模式。參數必須爲NULL。這是關於OLE和COM的問題。
       CoInitializeEx(LPVOID),新版本,可以用參數指定協同模式,如多線程模式,但注意單元的協同模式是不能改的,如果在已經初始化爲多線程的單元裏初始化OLE將失敗並返回RPC_E_CHANGED_MODE。每個線程只要調用一次初始化就夠了,同一線程中的後續調用也將通過,但會返回S_FALSE。後面解除初始化調用要與本調用一一對應,返回S_FALSE的CoInitialize調用也計算在內。應用程序的第一個線程將調用CoInitializeEx(COINIT_APARTMENTTHREADED或0),必須是最後一個解除初始化的。如果不按上面的順序進行初始化/解除函數調用,在該單線程單元(STA)裏後續的初始化調用將失敗,應用程序將無法工作。由於無法控制本地服務器的載入/御載順序,在DLLMain裏調用初始化/解除函數是不安全的。
例:
1)在DLL中使用ADO數據庫組件時,調用程序調用該DLL時會出現"尚未調用CoInitialize"錯誤,解決的辦法是在程序初始化時調用CoInitialize(nil)方法。


initialization
CoInitialize(nil);

{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
finalization
CoUninitialize;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
 
2) 把WebBrowser封裝到Dll裏面調用的時候總是說“尚未調用 CoInitialize。”,"CoInitialize has not been called"或“尚未調用 CoInitialize。”的解決方法。
用TWebBrowser顯示HTML文檔時或者把WebBrowser封裝到Dll裏面調用的時候總是說“尚未調用 CoInitialize。”,解決方法:
在“開始 -> 運行”中輸入 regsvr32 shdocvw.dll
然後在uses 中加入ActiveX,老版本的加入OLE2;
uses
  ActiveX, // 確認加入這個單元
           // 老版本的Delphi用 OLE2 代替
  Windows;


initialization
  CoInitialize(nil); // 手動調用  CoInitialize()

finalization
  CoUnInitialize; // 釋放內存

end.
Delphi中 CoInitialize和 OleInitialize有什麼區別
CoInitialize-------------   COM對象   
OleInitialize   -----------     OLE對象
COM庫:CoInitialize{Ex}、CoUnitialize   
OLE系統:OleInitialize、OleUnitialize
COM對象和OLE對象有什麼不同呢?是不是COM是OLE的子集?
OLE是COM的前身,MS現在已經全部轉道COM上了,應該現在不發展OLE
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章