自動化(Automation)基礎概念:介面描述語言(IDL)與類型庫(TypeLib)
許式偉 (著作權聲明)
2007-4-26
在前文,我們已經解釋了:
- 自動化(Automation)基礎概念:COM組件(Component)與介面(Interface)
- 自動化(Automation)基礎概念:變體(Variant)與Dispatch調用(IDispatch)
- 自動化(Automation)基礎概念:二次開發介面(API)與外掛程式(Addin)
接下來,讓我們來解釋兩個同樣常見的詞:
前文我們已經解釋了二次開發介面(API),它是應用程式用來向外部程式(或外掛程式)提供服務的。我們理一下思路:
- 應用程式是一個EXE形式的COM組件(EXE COM Server)。
- 應用程式對外提供介面(Interface),也就是我們通常說的二次開發介面(API)。
- 為了支援更多的使用者,特別是支援一些指令碼語言,應用程式的二次開發介面(API)通常被設計為雙介面。
清楚了這些,剩下來的問題是:既然應用程式API是介面,是一種二進位協議,那麼,第三方如何知道應用程式提供的介面是什麼樣子的呢?這就是本文要回答的內容。
每一種語言的模組,為了可以被用來提供給其他模組調用,都有自己固有的習慣。例如,C/C++程式員很習慣對外提供一個.dll/.so,外加一個.h檔案對介面進行描述(有時還會帶上一個.lib檔案,不過這裡我們假設.dll總是提供了標準的COM組件,那麼.lib是不需要的)。
為了是的應用程式提供的介面可以讓更多人可以使用,為了使任意語言的程式員能彼此理解對方,理解對方的API介面(DOM模型的對象樹),就需要有統一的規範。我們需要藉助一種中繼語言對介面進行描述,這就是介面描述語言(IDL)的由來。
那麼類型庫(TypeLib)又是什麼呢?有人說,類型庫(TypeLib)是IDL編譯後的結果,IDL是基於純文字的,可以方便人們閱讀,而類型庫(TypeLib)是二進位的,方便機器處理。
這麼說當然沒有錯。但是並沒有解釋類型庫(TypeLib)存在的價值。
我個人認為,類型庫(TypeLib)最重要的作用是充當了元資訊(Meta)的作用,你可以認為這是一種正常化的RTTI。從此意義上來講,我們不難明白,為什麼MS認為.NET是COM的延續 —— 類型庫(TypeLib)所能夠描述的元資訊(Meta)仍然不夠豐富,語言之間的壁壘仍然存在。
類型庫(TypeLib)的主要作用在於:
- RTTI - 為運行時刻動態獲得某種對象介面的元資訊(Meta)提供可能。通過類型庫(TypeLib),你可以很輕鬆獲得類(或介面)的種種資訊,如:
- 類名
- 基類
- 方法列表(包括方法的原型,方法的名稱)
- 屬性列表(包括屬性的類型,屬性的名稱)
- 等等
- 通過這種RTTI,為程式員提供各種服務。例如:
- 自動實現雙介面中的IDispatch介面。
- Visual BasicIntegration Environment(或其他IDE環境)提供的自動完成(只要你載入了TypeLib)。
- 根據TypeLib進行自動代碼產生(如MFC程式可以匯入一個TypeLib自動為其產生相應的C++標頭檔/Wrapper原始碼)等。
- 由於類型庫(TypeLib)包含了介面的完整資訊,它一定程度上起到取代IDL或.h檔案的作用。考慮到TypeLib可以作為應用程式的資源存在,這樣我們發布程式的時候,就不需要無謂再帶上IDL或者提供額外的.h檔案。
相信你已經很清楚IDL和TypeLib這兩個重要概念了。我這裡提供一個CodeGuru(這裡作了修正。抱歉,我記憶成CodeProject了)上的一個常式結束本文。該程式枚舉類型庫(TypeLib)中的資訊,並將其列印出來,略微改變一下,應該可以做出一個實際可用的應用程式。相信有人需要,希望對你有協助。到這裡下載:TypeLibEnum.rar。
補充:如果你只是要查看類型庫(TypeLib)——事實上,多數人屬於這種情況,而不是編程對它進行操作,那麼你可以:
- 通過Visual Studio(我知道VS 6.0版本有,更高版本未確認)帶的OLE View(全稱是OLE/COM Object Viewer)進行查看。File菜單下有View TypeLib...選項。當然哪些已經註冊到系統的TypeLib,已經直接列出來了。
- 通過Microsoft提供的各種物件瀏覽器查看。物件瀏覽器在很多MS的產品中都帶了,例如Visual Basic 6.0,包含VBA支援的應用程式(如Word/Excel/PowerPoint等等),Visual Studio 2005,等等。