什么是接口
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. Where does beauty come from?

    One more question, rational beauty should come from a dedicated brain and mind. Should there be more ...

  2. windows下 mysql忘记密码怎么办

    第一种: 1. 关闭正在运行的MySQL服务. (先查看mysql是否重命名,net start)2. 打开DOS窗口,转到mysql\bin目录. 3. 输入mysqld --skip-grant- ...

  3. mybatis(二)执行CRUD操作的两种方式配置和注解

    一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...

  4. 夺命雷公狗---DEDECMS----17dedecms头条信息的取出

    我们在有些开发时候可能会用到些头条的文章,,添加过程如下所示: 我们在前台遍历数据的时候可以这样, 然后在后台更新首页模版后在去看下首页,效果如下所示:

  5. [记录]firefox繁体转换成简体的油猴脚本

    // ==UserScript== // @name 繁简转换 // @include *.* // @author yecao // @version 0.1 // @include * // @e ...

  6. zw版【转发·台湾nvp系列Delphi例程】HALCON FillUpShape1

    zw版[转发·台湾nvp系列Delphi例程]HALCON FillUpShape1 procedure TForm1.Button1Click(Sender: TObject);var img : ...

  7. 在Debian下安装ibus输入法

    sudo apt-get install ibus ibus-pinyin im-switch sudo apt-get install ibus-googlepinyin im-switch -s ...

  8. StringTokenizer类

    StringTokenizer是一个用来分隔String字符串的应用类. 1.构造函数 public StringTokenizer(String str)  //构造一个用来解析str的String ...

  9. MFC 进度条控件

    1.进度条 主要用来进行数据读写.文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用当前活动窗口标题条的颜色来不断填充. 2.进度条控制在MF ...

  10. 影响SQL server性能的关键

    一.逻辑数据库和表的设计数据库的逻辑设计.包括表与表之间的关系是优化关系型数据库性能的核心.一个好的逻辑数据库设计可以为优化数据库和应用程序打下良好的基础.   标准化的数据库逻辑设计包括用多的.有相 ...