十一自动化对象内容摘要:

etTypeInfoCount GetTypeInfo GetIDsofNames Invoke 接口指针 Add Substract Multiply Divide 0 1 2 3 分发表 组件的实际业务功能 IUnknown IDispatch 10  更常用地 ,我们把具体的计算功能也作为接口直接暴露出去 ,我们从 IDispatch派生一个接口 IMath. [ object, uuid(2756E11CA606482F969C14153E1D1609), dual//说明是一个双接口 ] interface IMath: IDispatch { properties: methods: [id(0)] HRESULT Add //0,1,2,3分别是分发 ID ([in] long Op1,[in] long Op2,[out,retval] long* pResult)。 [id(1)] HRESULT Substract ([in] long Op1,[in] long Op2,[out,retval] long* pResult)。 [id(2)] HRESULT Multiply ([in] long Op1,[in] long Op2,[out,retval] long* pResult)。 [id(3)] HRESULT Divide ([in] long Op1,[in] long Op2,[out,retval] long* pResult)。 } 11  自动化对象实现双接口 : class CMath:public IMath {…… public: //来自 IUnknown的三个函数 virtual HRESULT __stdcall QueryInterface(…… )。 virtual ULONG __stdcall AddRef()。 virtual ULONG __stdcall Release()。 // 来自 IDispatch的三个函数 HRESULT GetTypeInfoCount( …… )。 HRESULT GetTypeInfo( …… )。 HRESULT GetIDsOfNames(…… )。 HRESULT Invoke( …… )。 // 来自 IMath的三个函数 HRESULT Add(long Op1, long Op2, long* pResult)。 HRESULT Substract(long Op1, long Op2, long* pResult)。 HRESULT Multiply(long Op1, long Op2, long* pResult)。 HRESULT Divide(long Op1, long Op2, long* pResult)。 }。 //此 COM对象同时通过分发接口给外界提供分发调用服务。 通过IMath接口直接通过虚表来提供普通的服务 . 12 实现双接口的自动化对象的虚表和分发表 pVtable QueryInterface AddRef Release m_pData GetTypeInfoCount GetTypeInfo GetIDsofNames Invoke 接口指针 Add Substract Multiply Divide 0 1 2 3 分发表 IUnknown IDispatch IMath 13 3 自动化接口的实现  分发接口的四个函数从功能上来说分为两组 : 1. GetTypeInfoCount与 GetTypeInfo函数表示对类型库的支持 . 通常客户并不需要从分发接口的这两个函数中来访问类型库 .如果愿意 ,客户可以借助 IDE生成封装类 ,或者直接使用操作类型库也可以 . 但如果真要实现它 ,那么 : 1. 提供类型库文件 (MIDL编译器对 IDL编译的结果 ) 2. GetTypeInfoCount返回 1, 否则返回 0。 3. GetTypeInfo 使用 LoadTypeLib得到 ITypeLib接口 .然后得到 ITypeInfo接口 .一旦客户得到 ITypeInfo接口指针就可以完全地了解接口的类型及其所支持的属性和方法。 2. GetIDsOfNames和 Invoke完成函数的分发调用 . GetIDsOfNames有两种实现方法 :。 它当然知道自己所有的方法和属性的分发ID。 使用 switch case或者如果数目太多的话 ,使用表格进行查表 . 14 HRESULT GetIDsOfNames( REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId ) { // 假设 cNames==1,即一回只查一个名字 . char * str=OLE2T(rgszzNames[0])。 if (strcmp(“Add”,str,3)==0) rgDispId[0]=0。 //加法返回 0 else if (strcmp(“Substract”,str,8)==0) rgDispId[0]=1。 //减法返回 1 e。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。