全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2015
推到 Plurk!
推到 Facebook!

Delphi COM編程的一個BUG

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-11 13:09:35 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 http://www.programfan.com/showarticle.asp?id=191 Delphi COM編程的一個BUG 由於工作需要,得在一個DELPHI寫的普通DLL中來調用一個VC寫的進程內COM元件來實現功能。DLL很順利就編寫成功,但是在使用一個EXE程式來調試這個DLL時,DLL即總是報異常錯誤。,由於DLL所調用的這個使用VC寫的這個COM元件在EXE中調用調試完全通過,所以其出錯的可能性極小。我又非常的仔細檢查了個用DELPHI寫的DLL,也沒有發現錯誤,卻發現這個異常使用try和except還是可以攔住的,也就是說肯定是DELPHI本向所産生的異常。這就奇怪了,難道是DELPHI本身的問題造成的這種情況,我不敢肯定,所以只得從VCL源碼一級來對這個程式進行除錯。 在DLL中是COM物件是通過調用DELPHI的RTL函數CreateComObject來建立的,於是我先從這個函數入手開始調試。這個RTL函數很簡單,只有一行代碼: OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, Result)); 即使用Windows API函數CoCreateInstance函數來建立並返回COM元件的實例。這個API函數外面套了一層OleCheck函數,Delphi RTL函數OleCheck的作用是如果CoCreateInstance沒有返回S_OK即COM元件建立成功,那麽OleCheck將産生一個異常。我程式當中的異常會不會是這OleCheck函數調用所報出來的呢,於是我試著將OleCheck去掉,讓把CoCreateInstance函數把其返回值顯示出來。我試著運行修改過後的程式,呵呵CoCreateInstnace函數所返回的值果然不對,是2147746288十六進位數是800401F0。在MSDN中查得此值表示的含意是CoInitialize函數沒有被調用。CoInitialize是COM元件的初始化函數,是DELPHI封裝COM時絕對應該負責調用的東西,難道這次的錯誤真是由於沒有調用CoInitialize函數所造成的,我半信半疑。試著將CoInitialize函數的調用加到了DLL單元的initialization部分,將CoUninitialize函數加到了DLL單元的finalization部分。再次使用外部EXE來調試這個DLL,果然不出錯了。 錯誤是找到了,但是錯誤是怎樣造成的呢。經過進一步的查找。發現錯誤出在Delphi的ComObj單元initialization部分。此處有以下一段代碼: if not IsLibrary then begin SaveInitProc := InitProc; InitProc := @InitComObj; end; 這段代碼判斷當前程式是否是一個DLL(通過IsLibrary變數來判斷)如果不是的話,則將初始化的過程設爲InitComObj函數。而DELPHI執行調用CoInitialize函數的操作正是在這個InitComObj函數中調用的,難快會出錯。最終究其原因可能是寶蘭的開發人員只注意到了ActiveX Library這類進程內COM框架的元件出始化的情況,而忘記了還可能有在普通DLL中調用COM元件來實現功能的情況造成了上述的錯誤。至此問題全部解決,不過筆者還想多說兩句,就筆者認爲對COM的支援是DELPHI做得比較差的地方之一,像這類錯誤在VC當中就根本不會出現的,真的是很希望寶蘭的開發人員能在DELPHI6中把DELPHI對COM的支援做得更好,使DELPHI變得更加的完美 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-30 8:48:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!