Delphi中CoInitialize之探究


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

如果是使用多線程的話那就在

Execute事件的開頭加上

CoInitialize(nil)

結尾加上

CoUninitialize()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM