雙重接口

雙重接口

雙重接口是從IDispatch接口派生,但是添加了一些新的方法到vtable中,IDispatch的客戶端可以使用它的GetIDsOfNames和Invoke方法來得到和訪問那些方法指針。

COM Interface Types
COM接口類型
COM內可以定義這三種接口:
● 自定義接口
● 調度接口
● 雙重接口
Custom Interfaces
自定義接口
使用自定義接口時,由接口定義的那些方法都被定義在一個vtable中。對於vtable來說,只有那些方法入口才是有用的。方法的順序被定義在接口中。
圖4-4展示了一個自定義接口。自定義接口總是從接口IUnknown派生。IUnknwon是所有COM接口的基礎接口,定義了三個方法:AddRef、Release和QueryInterface。跟著這些方法之後的是指向接口ICourseManagement所包含方法(GetCourse、SetCourse和GetCustomerControl)的指針
圖4-4 自定義接口的列表(http://book.csdn.net/bookfiles/179/img/image007.gif)
這種接口的特點在於這是調用方法最快的途徑,但是它會受限於程式語言,接口定義必須在編譯時可見。腳本客戶端(比如VBScript和JavaScript)無法使用這些接口,而Visual Basic 6編寫的客戶端可以使用這種接口
Dispatch Interfaces
調度接口
腳本客戶端不能處理自定義接口,它們只能使用調度接口。一個調度接口是一個
IDispatch接口的實現,它可以被腳本客戶端理解,所以在編譯時不需要知道接口的記憶體布局。
圖4-5展示了IDispatch接口的功能。除了IUnknown的方法外,一個IDispatch接口定義了四個方法。第三個和第四個是最有意思的方法:GetIDsOfNames和Invoke。GetIDsOfNames會被客戶端最先調用以得到一個方法名對應的ID。比如,客戶端傳入方法名“GetCourse”後將在返回值中得到其ID 0x60020000。這個方法的標號或者調度ID將會被傳入到IDispath的Invoke方法,以調用GetCourse這個方法。Invoke方法然後就會使用另一個映射表來根據調度ID得到方法入口,這樣這個方法就可以被調用。
你可以想像到這會比自定義接口慢。從方法名獲得其ID,以及通過ID調用方法的這些映射機制是需要花時間的。而且除了這種映射機制,還有數據轉換的過程。Invoke僅接受一個參數,這個參數內包含的參數需要通過轉換才能用來調用目標方法。
圖4-5 調度方法的一個表格http://book.csdn.net/bookfiles/179/img/image008.gif
Dual Interfaces
雙重接口
自定義接口可以提供最佳的性能,而調度接口可以被腳本客戶端調用。為了兩全其美,微軟設計出了雙重接口。雙重接口從IDispatch接口派生,但是添加了一些新的方法到vtable中(見圖4-6)。只知道IDispatch的客戶端可以使用它的GetIDsOfNames和Invoke方法來得到和訪問那些方法指針,但是可以訪問自定義接口的客戶端也可以直接使用它們。
圖4-6 一個雙重接口的列表http://book.csdn.net/bookfiles/179/img/image009.gif

相關詞條

相關搜尋

熱門詞條

聯絡我們