- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3 聚合实现.ppt
4.1.3 聚合实现 对象B聚合对象A,那么实现聚合的关键就在于对象B的QueryInteface成员函数。 对象B支持接口Some和Other,但他并不自己实现Some接口,但在QueryInterface成员函数中,它也接收对接口Some的请求,QueryInterface函数如下: HRESULT CB::QueryInterface(conat IID iid,void ** ppv){ if(iid==IID_IUnknown) { ……} else if(iid==IID_Other) {……} else if(iid==IID_Some) return m_pUnknownInner-QueryInterface(iid,ppv); else{……} return S_OK;} 聚合实现 对象A的IUnknown接口指针m_pUnknownInner成员变量是在对象B构造了对象A之后保存的对对象A的引用,QueryInterface通过它便可以获得对象A的接口指针。 要解决聚合的接口调用与COM接口规范的矛盾的关键在于A的IUknown接口,对象A实现了两个 IUnknown接口,一个用于被聚合的情况,另一个用于正常被客户使用的情形。在被聚合的情况下,客户看不到对象A的IUknown接口,当客户向Some接口请求 IUnknown接口时,被隐藏的 IUnknown接口把外部对象B的 IUnknown接口传递出去,因此,客户程序只看到外部对象的 IUnknown接口。可是内部对象A怎样才能获得外部对象B的 IUnknown接口指针。 HRESULT CoCreateInstance(……); 此函数中的第二个参数pUnknownOuter就是用于被聚合的情况。并且类厂接口的CreateInstance成员函数也包含了这个参数,所以,当外部对象B创建内部聚合对象A时,它把自身的IUknown接口指针传递给内部对象A。内部对象A也可以据此判断自己是否被聚合,如果参数为NULL。则表明没有;否则则有。内部对象A实现两个 IUnknown接口分别用于:委托 IUnknown和非委托 IUnknown(delegating unknown和nondelegating unknown)。 聚合实现 按照通常使用方式实现的 IUnknown为非委托 IUnknown,而委托 IUnknown在不同的情况下有不同的行为:当对象被正常使用时,委托 IUnknown把调用传递给对象的非委托IUnknown;当对象被聚合时,委托IUnknown把调用传递到外部对象的 IUnknown接口,即对象被创建时传递进来的pUnknownOuter参数,并且,这时外部对象通过非委托IUnknown对内部对象进行控制。这两种情况如图4.4和4.5所示。 从图4.4和图4.5中可以看出,委托IUnknown本身并不实现自己的操作,它只是根据不同的情况传递给非委托 IUnknown或者外部对象的IUnknown。而外部对象可以直接控制内部对象的非委托IUnknown。 因为C++类不支持同时实现两个 IUnknown,所以委托 IUnknown和非委托 IUnknown不能都使用 IUnknown类,但在此可以定义一个新的类。因为COM不是通过类名来识别接口,而是通过vtable来调用接口成员函数,因此可以定义一个INondelegationUnknown类来完成和IUnknown类一样的任务。 因为对象A支持聚合,所以它要实现INondelegationUnknown接口。 聚合实现 其中的私有部分为: private: IUnknown * m_pUnknownOuter;//指向外部 IUnknown的指针 在类A中非委托 IUnknown的三个函数的实现与正常情况下的操作一样。 NondelegationAddref和NondelegationRelease函数负责维护引用计数; NondelegationQueryInterface函数负责接口的查询,唯一要注意的是,通过NondelegationQueryInterface函数请求 IUnknown接口指针时,它返回非委托 IUnknown接口指针。 委托接口的实现 委托 IUnknown本身不进行任何操作,它通过m_pUnknownOuter成员函数判断是否被聚合,在聚合的情况下, m_pUnknownOuter指向外部对象的 IUnknown接口,则委托Ikknown把调用传递给m_pUnknownOuter;
您可能关注的文档
- 2017年重庆医科大学613药学综合A考研大纲.doc
- 2017年重庆医科大学614药学综合B考研大纲.doc
- 2017年陕西教育系统新媒体周榜(10.8-10.14).doc
- 2017第二届南开大学天津市新型企业家高级研修班招 .doc
- 2018年10月广东省高等教育自学考试各专业 .doc
- 2018年全国硕士研究生招生考试农学门类联考考试大 .doc
- 2018年西安交通大学面向香港、澳门、台湾地区招收 .doc
- 2018高职 化工仪表自动化 - 全国职业院校技能大赛.doc
- 20XX-XX-XX发布 20XX-XX-XX实施 - 国家认证 .doc
- 215215215215215专业合作社章程.doc
最近下载
- 第8课《我们受特殊保护》第3课时特殊关爱助我成长 课件 道德与法治六年级上册.ppt
- 室外电气管线技术交底.pdf VIP
- 2025至2030中国油气管道工程行业产业运行态势及投资规划深度研究报告.docx
- 填充改性讲义.ppt
- 《海洋石油工程设计指南》 第04册 平台结构设计完整版.doc VIP
- 第8课《我们受特殊保护》第3课时特殊关爱助我成长 课件 道德与法治六年级上册.pptx
- 2025人教版数学三年级上册 曹冲称象的故事1《质量单位的认识》(课件).pptx
- GBT 22239-2019 信息安全技术 网络安全等级保护 基本要求 v2.0.1.xlsx VIP
- 基于STM32的自动寻路消防小车的设计与实现.docx VIP
- 西师大版三年级上册数学应用题专项综合练习题.doc VIP
原创力文档


文档评论(0)