十一自动化对象内容摘要:
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。十一自动化对象
本资源仅提供20页预览,下载后可查看全文
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。
相关推荐
十二五期间保险业发展的机遇和挑战
业的挑战: 风险管理、人才储备、监管及时调整等方面 案例: 人民币海外 投资 私募股权基金 ;私募债券 二、后危机时代的保险监管:监管转型赋予的机遇与挑战 此次国际金融危机并没有对保险业经营模式产生太大的直接触动 但金融危机的影响主要体现在监管环境的改变上 新的监管名词大量涌现 : 系统性风险,宏观审慎监管,逆周期监管 ,等等 二、后危机时代的保险监管:监管转型赋予的机遇与挑战
南京医科大学第二附属医院南京医科大学第二临床学院
造影鉴别缺血性心肌病。 6)心内膜心肌活检:病理组织学诊断和病毒病因学检查,病毒性心肌炎演变为扩张型心肌病。 扩张型心肌病 至精至诚 至善至爱 • 诊断标准 ( 1)临床常用左心室舒张期末内径( LVEDd)> cm(女性)和) cm(男性)。 ( 2) LVEF< 45%和(或)左心室缩短速率( FS)< 25%。 ( 3) LVEDd/ cm2,体表面积( m2)= 身高( cm)+ 体重(
医药生物领域专利申请文件的撰写
间 3. 及时向专利审批部门提交保藏证明和存活证明 如果生物材料是发明的技术方案中必须使用的,同时公众在优先权日 /申请日前不能得到,都必须保藏。 申请人应在提交专利申请前,最迟在优先权日 /申请日时,向国家知识产权局认可的生物材料样品国际保藏单位提交生物保藏; 在提交专利申请时,在请求书和说明书中注明保藏该生物材料样品的单位名称、地址、保藏日期和编号以及该生物材料的分类命名