COM對象的生存周期與IUnknown接口
COM對象的生存周期分為兩部分來講:客戶端與COM本身:
在客戶端,視定義的COM對象接口而定,像我們例子中的v_Obj,定義成全局變量,那么COM對象在創(chuàng)建時產(chǎn)生,只有在程序退出時才被釋放。我們也可以在形式上將其釋放,如:v_Obj:=nil,這樣這個COM接口就無效了。
在COM本身,COM接口的通過記數(shù)的方式來完成COM的生存周期,為什么采用記數(shù),當(dāng)然很簡單——因為COM可能同時被多個程序所調(diào)用。有一個程序連接到COM時
計數(shù)器加1,某個釋放時計數(shù)器減1,當(dāng)計數(shù)器為0時,COM對象才真正從內(nèi)存中移除。
IUnknown接口:
      為什么將IUnknown接口與生存周期放在一起講是有原因的,COM生存周期中的計數(shù)器就定義在IUnknown接口中:AddRef、Release、QueryInterface。這三個接口也是IUnknown的全部身家。對三個接口還是解釋一下:
AddRef:當(dāng)COM產(chǎn)生一個客戶端連接的時候,AddRef方法負(fù)責(zé)將計數(shù)器加1;
Release:當(dāng)COM釋放一個客戶端連接的時候,Release方法負(fù)責(zé)將計數(shù)器減1,如果計數(shù)器為0,釋放COM;
QueryInterface:因COM支持多個接口,QueryInterface負(fù)責(zé)找出用戶指定的接口以返回正確的VTable;
接口全局標(biāo)識:
       上面說到QueryInterface的時候,提到了要找到正確的接口。其實正確的接口就是靠全局標(biāo)識符來識別的。它是一個128位的數(shù)字,是按照統(tǒng)計學(xué)的方法,計算出來的,可唯一標(biāo)識出每個接口(理論上)。具體實現(xiàn)我們不用管,它產(chǎn)生的方法很簡單,在Delphi中按Ctrl+Shift+G就可以產(chǎn)生一個。
COM實現(xiàn)在Delphi中的實現(xiàn)
相信通過上面的介紹對COM應(yīng)該也有了初步的認(rèn)識了,現(xiàn)在就將點實際的東西,如何在Delphi下編寫COM。
       在Delphi下面開發(fā)COM是比較容易的,Delphi封裝的COM開發(fā)的最基本的要素,只要你去編寫對象的實現(xiàn)類就行了,其他的全有Delphi搞定。
1、打開Delphi,選擇File/New/Others,選擇Active頁的ActiveX Library,選擇File/New/Others,選擇Active頁的COM Object,出現(xiàn)的向?qū)е斜容^重要的選項如下:
Class Name:實現(xiàn)類的名稱,自定。
Include Type Library:是否包含類型庫文件,如果不選擇,Delphi將不產(chǎn)生類型庫文件,應(yīng)此上面輸入的Class Name也無效。也就意味著接口類、實現(xiàn)類、實現(xiàn)方法都的自己寫。對于不是很熟悉COM的的人員最好不要采用這種方式。
其它參數(shù)均可采用默認(rèn)值,具體意義可參見有關(guān)資料。
2、接口的編寫
選擇View/Type Library,選擇接口,右鍵New選擇Method,在右邊Attributes的Name中輸入接口的名稱,在Parameters中加入需要加入的輸入和輸出參數(shù)。注意:設(shè)置參數(shù)類型時,如果是返回參數(shù)的,參數(shù)類型后面要加上“*”。點擊刷新,在程序單元中就出現(xiàn)了剛定義的接口,在此編寫實現(xiàn)代碼就可以了。
3、COM的安裝
編寫完成后編譯,通過Run/Register ActiveX Server注冊編譯好的COM,通過Run/Install COM+ Objects安裝COM
組件,在彈出的對話框中選擇接口,在接下來的對話框中可以選擇安裝到已有的COM應(yīng)用程序中也可以安裝到新的COM應(yīng)用程序中。這樣就完成了COM的安裝,你可以打開系統(tǒng)中的組件服務(wù)看到你所安裝的COM。
由于工作繁忙,沒能更加詳細(xì)的將個人的心得詳細(xì)描述出來,本人會陸續(xù)發(fā)表自己的心得與大家分享。朋友們有興趣的可以和我聯(lián)系;