- 1、本文档共50页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
六 . COM接口的其他实现方法 基于表格驱动的接口查询 接口查询的本质 宏 应用 多重继承下的名字冲突 潜在的缺陷 临时的方案 使用复合技术(嵌套类)实现接口 COM主对象和COM子对象 COM 主对象的实现 COM 子对象的实现 基于复合技术的COM对象的内存结构 1.基于表格驱动的接口查询 1.1 接口查询的本质 前面我们使用继承的方式实现接口,使用多重继承的方式实现多个接口. 在这种方式下,接口的查询QueryInterface函数的实现非常的直接且直观. 在多重继承方式下,接口类是基类, IUnkown接口是最上层的基类. 对象类是接口类的派生的子类. 在内存中,子类比基类“大”. 因为子类除了包含基类的成员以外,还包含自己的成员.子类的一个实例中包含有基类的一个“subobject”,子对象. 如果这个基类还有基类,这个子对象中还含有一个更上层的子对象. QueryInterface函数的本质是: 使用statice_cast操作符在子类的对象中加上基类的偏移从而从而得到基类的子对象.转换到不同的基类时,要加上不同的偏移. 所以QueryInterface实际上是在不同的基类和不同的偏移中工作. 我们可以把基类和对应的偏移量抽象出来.作成表格.使得QueryInterface的工作更加形式化. 最终使得COM的编码更加形式化. (这里的工作为向MFC过渡而热身.我们看到,MFC中古怪的代码也是有其理性的由来的.? ) 1.2 宏 为了实现表格驱动的QueryInterface, 我们定义这样的一个结构: typedef HRESULT (STDAPICALLTYPE *INTERFACE_FINDER)(void *pThis, DWORD dwData, REFIID riid, void **ppv); //这是一个查询接口的函数,暂时这里并没有用上. #define ENTRY_IS_OFFSET INTERFACE_FINDER(-1) //所以这里定义了一个伪函数ENTRY_IS_OFFSET typedef struct _INTERFACE_ENTRY { const IID * pIID; // 要寻找的接口的IID INTERFACE_FINDER pfnFinder; // finder function long dwData; // finder function所需的参数.这里指偏移量. } INTERFACE_ENTRY; //暂时,这里只使用了第一和第三个分量 然后定义了几个宏: #define BASE_OFFSET(ClassName, BaseName) \ (DWORD(static_castBaseName*(reinterpret_castClassName*(0)) - 0 这个宏用来计算基类BaseName到子类ClassName的偏移.(一个完整对象中的基类子对象的起始地址到完整对象的起始地址的偏移) reinterpret_castClassName*(0 把绝对内存地址0换成为子类对象的地址. static_castBaseName*(子类指针) 把子类指针转换为基类指针.这个工作由编译器计算出偏移.并且加上偏移值. DWORD(基类指针地址) - 0基类指针地址转换成绝对的数字后减去子类指针的绝对地址的数字. 宏BASE_OFFSET(ClassName, BaseName) 返回基类BaseName到子类ClassName的偏移量. 如下图所示: 在这个宏的基础上又定义了几个宏: #define BEGIN_INTERFACE_TABLE(ClassName) \ typedef ClassName _InterfaceTableClassName;\ //申明了一个静态函数,返回接口表 static const INTERFACE_ENTRY *GetInterfaceTable(void) \ { static const INTERFACE_ENTRY table[] = {\ //函数体中, 定义一个静态的接口表, 定义了类,此表就分配了.对所有的对象而言是同一个. #define IMPLEMENTS_INTERFACE(ItfName) \ { IID_##ItfName, ENTRY_IS_OFFSET, BASE_OFFSET(_InterfaceTableClassName, ItfName) }, //接口表项,对于接口I
您可能关注的文档
- 健康常识——身体的晴雨表指甲.doc
- 健康观念钱不等于幸福.ppt
- 健康评估 胸部评估肺和胸膜的评估.ppt
- 健康生活習慣調查表 年 月 日.doc
- 江佩霞合理存款问题(江佩霞).doc
- 江苏淮安博物馆监控方案书.doc
- 江苏省第十六次血液学学术会议大会发言文章 江苏省医学会.doc
- 江苏杂谈适合沪宁高速上的导游词.doc
- 讲文明、爱清洁、创环保教案.doc
- 降低成本减少浪费.ppt
- 600367_2021_#CSR_红星发展_红星发展2021年度履行社会责任报告_2022-04-21.pdf
- 600227_2021_#CSR_圣济堂_贵州圣济堂医药产业股份有限公司2021年度社会责任报告_2022-04-22.pdf
- 603879_2021_#CSR_永悦科技_永悦科技股份有限公司2021年度社会责任报告_2022-04-19.pdf
- 600439_2021_#CSR_瑞贝卡_社会责任报告_2022-04-29.pdf
- 002073_2021_#CSR_软控股份_2021年社会责任报告_2022-04-25.pdf
- 600592_2021_#CSR_龙溪股份_龙溪股份2021年度社会责任报告_2022-04-22.pdf
- 002317_2021_#CSR_众生药业_2021年社会责任报告_2022-04-25.pdf
- 600496_2021_#CSR_精工钢构_精工钢构2021年度社会责任报告_2022-04-29.pdf
- 000065_2021_#CSR_北方国际_2021年社会责任报告_2022-04-29.pdf
- 603032_2021_#CSR_*ST德新_德力西新疆交通运输集团股份有限公司2021年度企业社会责任报告_2022-04-25.pdf
最近下载
- 围棋经典定式.pdf VIP
- 外空法与国际太空探索考核试卷.docx VIP
- (高清版)B-T 42588-2023 系统与软件工程 功能规模测量 NESMA方法.pdf VIP
- 部编版七年级上册语文背诵篇目.pdf VIP
- 人教版2025年八年级数学下学期期末总复习(专题训练)八下期末真题百题大通关(158题58题型)(基础版)(学生版+解析).docx VIP
- 地形学的基本知识4小时.ppt VIP
- 工程变更情形下措施费争议的裁判规则.docx
- 从业人员安全培训教育档案(一人一档).pdf VIP
- 碳排放管理员(高级)认证考试复习题及答案.doc VIP
- 2025年租房合同范本(可直接打印)与租房合同范本(完美打印版) .pdf VIP
文档评论(0)