IDispatch

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

IDispatch介面組件對象模型(COM)中的標準介面,也稱自動化(Automation)接口,繼承自IUnknown,用於讓其他函式使用OLE Automation英語OLE Automation協議[1]。COM規格書[2]規定COM物件應該是三種接口類型中的至少一種:

  • 基於虛表(vtable)的IUnknown的定製接口;
  • 分派(dispatch)的IDispatch接口以支持內觀資訊(introspection)。允許客戶應用程序在運行時查出COM組件支持哪些屬性與方法,即實現了運行期類型信息(RTTI)。客戶應用程序編譯時不需要知道COM的對象成員。腳本語言如VBS不能使用指針乃至函數指針,只能通過IDispatch接口訪問COM組件。這是通過執行IDispatch接口中的Invoke方法。這是一種遲綁定英語Late binding。與第一種定製接口相比,增加了內觀資訊與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}。

參考資料[編輯]

  1. ^ Microsoft MSDN: IDispatch interface頁面存檔備份,存於網際網路檔案館
  2. ^ COM specification. [2016-12-26]. (原始內容存檔於2016-12-21). 
  3. ^ Microsoft MSDN: ActiveX/COM Q&A December 1995頁面存檔備份,存於網際網路檔案館

相關條目[編輯]

外部連結[編輯]