在COM組件的使用和開發過程中經常需要擷取有關組件的資訊。而COM組件以二進位代碼的形式發布,如果不藉助特定的工具這些相關資訊將難以被擷取。通過訪問類型庫就可以查看COM組件的資訊。
一、類型庫的基礎知識介紹:
1、類型庫的定義:
類型庫:在類型庫中以二進位的形式描述了一個或多個對象的類型資訊。具體的類型資訊包括:組件的CLSID、所支援介面的IID、介面的成員函數及其參數和傳回值類型等。
TTypedComObject類: TTypedComObject類及其衍生類別提供了對類型庫的支援。COM由TTypedComObject派生,而不是TComObjectFactory.Create;初始時,delphi調用了TTypedComObjectFactory.create、而不是TComObjectFactory.Create;(Delphi自動建立XXXX_TLB.pas檔案;)
2、查看類型庫的資訊
在組件程式中,會專門建立一個類型庫檔案(tlb尾碼名),此類型庫檔案定義和實現了組件向外所提供的介面、屬性、方法和事件。Delphi專門為這個檔案提供 了一個Pascal版本的檔案(tlb副檔名),而且自動維護這兩個檔案的一致性。類型庫的建立是根據.tlb檔案中的描述進行編譯的。Tlb檔案包括Attributes、Uses、Flags、Text。Text檔案下面給出一段檔案描述:通過coclass關鍵字定義了物件類型資訊,將據此建立相應的封裝類。library關鍵字描述了當前庫資訊,並可通過importlib關鍵字引入其他的類型庫。
| [ uuid(B8DF2272-9F93-454E-9A95-60E32179C925), version(1.0), helpstring("ProjectDCOM Library") ] library ProjectDCOM // 描述了當前庫資訊, { importlib("stdole2.tlb"); // 引入其他的類型庫 importlib("midas.dll"); importlib("stdvcl40.dll"); [ uuid(E30249CE-0CAB-4841-ADE4-83C5F26E52C7), version(1.0), helpstring("Dispatch interface for EnterAssist Object"), dual, oleautomation ] interface IEnterAssist: IAppServer { }; [ uuid(19CEE64A-4F7E-4626-AD07-FDCB6260C96F), version(1.0), helpstring("EnterAssist Object") ] coclass EnterAssist // 定義了物件類型資訊, EnterAssist自己定義的名稱 { [default] interface IEnterAssist; }; }; |
3、使用類型庫的好處:
1>、編寫自動化控制時早期串連(Early Binding);
2>、可以根據類型庫中的描述資訊建立相應的封裝類。通過此封裝類將能很方便的在客戶程式中使用組件對象提供的屬性和方法。
3>、公用程式可以用來讀取並顯示有關包含類型庫的COM伺服器的資訊,在COM客戶和伺服器之間自動參數調度;
4>、類型庫對某些COM伺服器是必須的,例如:Automation 伺服程式和ActiveX控制項;
二、類型庫操作:
1、類型庫中添加介面、屬性、方法和事件
1>、第一種方法:開啟實現檔案,選擇【Edit】菜單裡的【Add To Interface】命令(注意:只有開啟了實現檔案,這個命令才能使用),Delphi將彈出增加介面對話方塊。在對話方塊裡的Interface項選擇Properties/Methods-IStringGridX,然後在Declaration裡寫入t屬性的聲明(如果你選中了對話方塊裡的Syntax Helper選項,Delphi將隨時提示你應該輸入的內容); 點擊OK後,這個屬性的相關資訊將自動加入到控制項的實現檔案、類型庫檔案和對應的Pascal檔案中。因為控制項的介面是雙向的,所以在Pascal檔案裡使用了讀和寫兩個方法來實現控制項的屬性。
2>、第二種方法:使用類型庫檔案中的工具條:可以添加介面、方法、以及屬性到COM伺服器中;
注意:工具條上可以通過點擊滑鼠右鍵彈出的菜單中選擇Text Labels命令開啟工具條的標題;
2、類型庫檔案中的工具列:
1>、Interface(介面): 自動為每一個建立的介面產生一個GUID;
2>、Dispinterface(派遣介面): 與介面類似,但是使用不同的派遣機制調用伺服器中的方法;
3>、CoClass(): 類別的定義,被指定給實現介面的COM對象;使用COM對象之前必須先使用一種方法從類別定義建立真正的類別對象(變數); 再從類別對象取去需要的介面;最後再從取得的介面中調用需要執行的方法或需要存取的屬性;
4>、Enumeration(枚舉): 與枚舉類型類似;有整數ID來指明,而不是通過集合類型;
5>、Constant(常量):只有在枚舉下才有用;可以編輯Name、Value屬性;
6>、Alias(別名): 用於定義使用者要包括一條記錄類型(record)或等位型別(union)中的類型;
7>、Record(記錄類型): 記錄結構;
8>、Union(等位型別): 等同於Pascal Variant類型;
9>、Module(模組): 模組是方法和常量的集合;
10>、Method(方法): 輸入參數(in)、輸出參數(out)、可變參數(var);
11>、Property(屬性): 唯讀、唯寫、讀寫三種;
12>、Refresh(更新): 使Delphi更新源檔案;
13>、Register(註冊): 編譯COM伺服器並把伺服器註冊到Windows中;
14>、Export(輸出到IDL): 在MIDL或Corba格式中很有用;
3、類型庫檔案中的對象列表和頁控制項:
對象列表(Object List):顯示伺服器中定義的介面、方法等,點擊會顯示相應的情況,然後還可以添加以下東西;
頁控制項(Page control):顯示對象列表中當前選中的接點的類型資訊。包括Attributes、Uses、Flags、Text;
類型庫也是一種資源;
不必在客戶應用程式中直接讀取類型庫;