IDispatch
IDispatch介面是元件物件模型(COM)中的標準介面,也稱自動化(Automation)介面,繼承自IUnknown,用於讓其他函數使用OLE Automation協定[1]。COM規格書[2]規定COM物件應該是三種介面類型中的至少一種:
- 基於虛表(vtable)的IUnknown的客製化介面;
- 分派(dispatch)的IDispatch介面以支援內觀資訊(introspection)。允許客戶應用程式在執行時查出COM元件支援哪些內容與方法,即實現了執行期類型資訊(RTTI)。客戶應用程式編譯時不需要知道COM的物件成員。手稿語言如VBS不能使用指標乃至函數指標,只能通過IDispatch介面訪問COM元件。這是通過執行IDispatch介面中的Invoke方法。這是一種遲繫結。與第一種客製化介面相比,增加了內觀資訊與invoke的開銷。[3]
- dual介面,同時支援上述兩種類型的介面
方法
支援IDispatch的COM物件實現的每個內容與方法都有自己的Dispatch ID,常縮寫為DISPID。用於在Invoke方法中辨識哪個內容或方法將被呼叫。
IDispatch衍生自IUnknown,並且擴充了4個額外的方法:
interface IDispatch : public IUnknown {
virtual HRESULT GetTypeInfoCount(unsigned int * pctinfo) = 0;
virtual HRESULT GetTypeInfo(unsigned int iTInfo,
LCID lcid,
ITypeInfo ** ppTInfo
) = 0;
virtual HRESULT GetIDsOfNames(REFIID riid,
OLECHAR ** rgszNames,
unsigned int cNames,
LCID lcid,
DISPID * rgDispId
) = 0;
virtual HRESULT Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS * pDispParams,
VARIANT * pVarResult,
EXCEPINFO * pExcepInfo,
unsigned int * puArgErr
) = 0;
};
IDispatch的介面識別碼被定義為GUID值{00020400-0000-0000-C000-000000000046}。
參考資料
- ^ Microsoft MSDN: IDispatch interface (頁面存檔備份,存於互聯網檔案館)
- ^ COM specification. [2016-12-26]. (原始內容存檔於2016-12-21).
- ^ Microsoft MSDN: ActiveX/COM Q&A December 1995 (頁面存檔備份,存於互聯網檔案館)