什么是接口
DLL的接口可以理解为其导出的那些函数,C++类的接口则是该类的一个成员函数集。
对于COM来说,接口是一个包含一个函数指针数组的内存结构,每一个数组元素包含的是一个由组件所实现的函数的地址。对COM而言,接口就是这样的一个内存结构,无关细节与具体语言实现。(即不管是C#还是C++实现,只要给我这么个内存结构,我就认为你是一个接口)
接口的作用
接口对COM来说很总要!只需记住下面三点:
(1)COM中接口就是一切。
(2)对客户而言,一个组件就是一个接口集合(客户通过QueryInterface获取想要的接口)。
(3)客户只能通过接口与COM组件打交道。
COM接口在C++中的代码实现
参加COM中接口的定义,在C++中,可以通过抽象基类来实现COM接口。
抽象基类,其实是定义了一个内存结构,抽象基类仅包含虚函数,因此其包含虚表与虚指针。如下图所示,抽象基类如

interface IX

{

virtual void STDMETHODTYPE Fx1()=0;

virtual void STDMETHODTYPE Fx2()=0;

virtual void STDMETHODTYPE Fx3()=0;

}

其在内存中仅包含一个虚指针,而这个虚指针则指向一组虚函数的实现列表(函数指针数组)。这刚好符合COM对接口的定义。

因此COM接口在C++中的实现是通过抽象基类实现的。子类继承抽象父类,并实现或重写抽象函数。子类同时也就继承了这种内存结构,即子类获得了向客户提供这种接口的提供能力,同时对于组件对于多个接口的支持,可以通过让子类多重继承抽象父类来实现。
 
一些细节
1、标准调用约定
在Microsoft平台上,COM接口提供的所以函数均遵循PASCAL调用约定,即函数将在返回到调用者之前进行参数的出栈处理。因此接口中的函数均有修饰符__standcall 或STDMETHODCALL
2、C++中接口虽然是抽象基类实现,但可以不用class来声明类,而是用OBJBASE.H中定义的宏

COM技术の接口的更多相关文章

  1. Atitit.cto 与技术总监的区别

    Atitit.cto 与技术总监的区别 1. 核心区别1 2. Cto主要职责1 3. 如何提升到cto1 4. CTO五种基本的必备素质:2 5. 2 1. 核心区别 技术总监(Chief Tech ...

  2. <转>技术团队新官上任之基层篇

    发表于2013-09-04 17:17| 10455次阅读| 来源<程序员>| 35 条评论| 作者高博 <程序员>杂志2013年9月刊技术团队管理EMC高博CTO 摘要:从技 ...

  3. UnionPay,ChinaPay 最新 银联支付接口C#\Asp.net\MVC 版本

    1.概念普及 一.理解什么是UnionPay.ChinaPay 这两个概念如果搞不清楚,绝对够你瞎折腾一段时间的. UnionPay:中国银联,最大的机构:他本身也提供系统接口但都是B2B的,对于单个 ...

  4. android系统平台显示驱动开发简要:LCD常用接口篇『二』

    平台信息:内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博客 ...

  5. 【转】Android LCD(二):LCD常用接口原理篇

    关键词:android LCD TFT TTL(RGB)  LVDS  EDP MIPI  TTL-LVDS  TTL-EDP 平台信息:内核:linux2.6/linux3.0系统:android/ ...

  6. [转载]CTO和技术总监区别

    原文地址:http://blog.sina.com.cn/s/blog_6024cfa90101cb0h.html 技术总监(Chief Technical Officer)与CTO(Chief Te ...

  7. Java程序员如何运用所掌握的技术构建一个完整的业务架构

    1.通用架构概述 创业之初,我们往往会为了快速迭代出产品,而选择最简单的技术架构,比如LAMP架构,SSH三层架构.这些架构可以适应初期业务的快速发展,但是,随着业务变得越来越复杂,我们会发现这些架构 ...

  8. (转)LCD:LCD常用接口原理篇

    关键词:android LCD TFT TTL(RGB)  LVDS  EDP MIPI  TTL-LVDS  TTL-EDP平台信息:内核:linux2.6/linux3.0系统:android/a ...

  9. (转)常见LCD接口

    LCD常用接口原理 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 xubin 平台信息:内核:linux2.6/linux3.0系统: ...

随机推荐

  1. codeforces 520 Two Buttons

    http://codeforces.com/problemset/problem/520/B B. Two Buttons time limit per test 2 seconds memory l ...

  2. nyist 596 谁是最好的Coder

    http://acm.nyist.net/JudgeOnline/problem.php?pid=596 谁是最好的Coder 时间限制:1000 ms  |  内存限制:65535 KB 难度:0 ...

  3. DO.NET操作数据库

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. contentProvider

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  5. 有关dwr推送的笔记

    想做一个web推送相关的东东,昨天搞了一天,终于把这些杂乱的配制弄清了,今天写出来方便以后记住,也方便大家看一下吧 1:引入dwr包,我用的是maven <dependency> < ...

  6. beta阶段事后诸葛亮会议

    项目名:约跑 组名:nice! 组长:李权 组员: 韩媛媛 于淼 刘芳芳 宫丽君 Beta Review会议 时间:2016.11.15 地点:冬华楼一楼大厅 会议内容: 约跑APP的Beta Rev ...

  7. update表关联

    第一种: update student set student.age =(select `user`.age from user where id=student.id ) where studen ...

  8. iOS的第一个习作

    首发:个人博客,更新&纠错&回复 代码在这里,对git还是使用不熟练,好在github新建项目后体贴地提示是不是要执行这样两句—— 这两句我肯定是背不住的,所以记一下. git rem ...

  9. 数据库性能优化:SQL索引

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...

  10. Date() 及其 如何验证用户输入的日期是合法的

    1.var someDate = new Date(Date.parse("May 25, 2004"));   <=>  var someDate = new Dat ...