IDispatch
![本页使用了标题或全文手工转换](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
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 (页面存档备份,存于互联网档案馆)