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页面存档备份,存于互联网档案馆

相關條目

外部連結