IDispatch接口 class iDispatch: public IUnknown publ virtual HRESULT Get Count( UINT"pctinfo)=0 virtual HRESULT GetTypeInfo( UINT iTInfo, LCID Icid ITypelnfo **ppTInf0)=0 virtual HRESULT GetlDsofNames( REFIID riid, LPOLESTR * rgSzNames UINT CNames, LCID Icid, DISPID'rgDispld)=0 virtual hreSULT Invoke( dispid displdMember, REFIID riid, LCID lcid WORD wFlags, DISPPARAMSpDispParams VARIANT "pVarResult, EXCEPINFO *p ExcepInfo, UINT puArgErr)=0
IDispatch接口 class IDispatch : public IUnknown { public: virtual HRESULT GetTypeInfoCount( UINT *pctinfo) = 0; virtual HRESULT GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) = 0; virtual HRESULT GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) = 0; virtual HRESULT Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) = 0; };
分发 DOISPID 整数,0和负数有特殊含义 保留的分发ID及其含义 分发ID 值 说明 接口的缺省成员,如果在客户程序中不指定属性或方 DISPID VALUE 则用此缺省成员 DISPID UNKNOWN 在 GetIDsOfNames函数中返回此值表明相应的成员 或参数名没有找到分发ID。 DISPID PROPERTYPUT-3 在属性设置函数中指示一个接收值的参数。 DISPID NEWENUM 集合对象的 NewEnum方法。 对象的 Evaluate方法,在控制器的脚本语言中可以用 DISPID EVALUATE 方括号来表示。 DISPID CONSTRUCTOR[-6 表示具有与构造函数相同功能的方法。 DISPID DESTRUCTOR-7 表示具有与析构函数相同功能的方法。 自动化接口通过分发ID管理方法和属性
分发ID(DISPID) • 整数,0和负数有特殊含义 • 自动化接口通过分发ID管理方法和属性 保留的分发 ID 及其含义 分发 ID 值 说明 DISPID_VALUE 0 接口的缺省成员,如果在客户程序中不指定属性或方 法,则用此缺省成员。 DISPID_UNKNOWN -1 在 GetIDsOfNames 函数中返回此值表明相应的成员 或参数名没有找到分发 ID。 DISPID_PROPERTYPUT -3 在属性设置函数中指示一个接收值的参数。 DISPID_NEWENUM -4 集合对象的_NewEnum 方法。 DISPID_EVALUATE -5 对象的 Evaluate 方法,在控制器的脚本语言中可以用 方括号[]来表示。 DISPID_CONSTRUCTOR -6 表示具有与构造函数相同功能的方法。 DISPID_DESTRUCTOR -7 表示具有与析构函数相同功能的方法
客户与自动化对象交互示意图 自动化对象 ○ vtable→ QueryInterface 客户程序 IPoint Add Ref Release Get Typelnfo Count Get TypeInfo GetIDsOfNames get X MoveTo
客户与自动化对象交互示意图 客户程序 自动化对象 IPoint QueryInterface AddRef Release GetTypeInfoCount GetTypeInfo GetIDsOfNames Invoke vtable get_x set_x get_y set_y MoveTo
Dispatch: Invoke 参数 displdmember 指定 DISPID 参数lcid 指定本地化标识 参数 wFlags 指示调用类型 DISPATCH METHOD、 DISPATCH PROPERTYGET、 DISPATCH PROPERTYPUT DISPATCH PROPERTYPUTREF 参数 pDispParams 包括调用的参数数组、参数的 DISPID数组、数组中参数个数等信息 参数 pVarResult 保存返回值信息 参数 pExceplnfo 保存异常信息 参数 puRgeR 错误参数的索引值
IDispatch::Invoke • 参数dispIdMember 指定DISPID • 参数lcid 指定本地化标识 • 参数wFlags 指示调用类型 – DISPATCH_METHOD、DISPATCH_PROPERTYGET、 DISPATCH_PROPERTYPUT 、 DISPATCH_PROPERTYPUTREF • 参数pDispParams – 包括调用的参数数组、参数的DISPID数组、数组中参数个数等信息 • 参数pVarResult 保存返回值信息 • 参数pExcepInfo 保存异常信息 • 参数puArgErr 错误参数的索引值
自动化兼容的数据类型() typedef struct tag VARIANT VARIANT yte b Val typedef struct tag VARIANT VARIANTARG float fatal double dorval typedef struct tag VaRiant VARIANT BOOL bool SCODE scode VARTYPE vt CY cy Val unsigned short rEserved 1 DATE date unsigned short wReserved2 BSTR bstr val unsigned short wReserved3 IUnknown inval union IDispatch * disp Val SAFEARRAY array ∥传值类型 short iVal ∥待续 ong IVal
自动化兼容的数据类型 ( 一 ) typedef struct tagVARIANT VARIANT; typedef struct tagVARIANT VARIANTARG; typedef struct tagVARIANT { VARTYPE vt; unsigned short wReserved1; unsigned short wReserved2; unsigned short wReserved3; union { // 传值类型 short iVal; long lVal; byte bVal; float fltVal; double dblVal; VARIANT_BOOL bool; SCODE scode; CY cyVal; DATE date; BSTR bstrVal; IUnknown *punkVal; IDispatch *pdispVal; SAFEARRAY *parray; // 待续