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