什么是接口?

说到COM,就不得不说接口了;在进行COM开发的过程中,可以说,我一直都在和各种各样的接口打交道。那接口是什么?对于COM来说,接口是一个包含一个函数指针数组的内存结构,每一个数组元素包含的是一个由组件所实现的函数的地址;所以,对于COM,接口就是这样的一个内存结构,其它东西都是一些COM并不关心的实现细节。

在C++中,可以使用抽象基类来实现COM接口。由于一个COM组件可以支持任意数目的接口,因此对于组件,可以使用抽象基类的多重继承来实现它。

接口的好处

接口提供了两个不同对象间的一种连接。对于客户来说,一个组件就是一个接口集。客户只能通过接口才能同COM组件打交道。而整体上来讲,客户对于一个组件可以说是知之甚少;甚至在某些时候,客户甚至不必知道一个组件所提供的所有接口,就像你进行Windows  Shell开发时,对于一个它提供的组件,很多时候,你不可能知道所有的接口的。对于一个应用程序而言,接口是最重要的。组件本身只不过是接口的实现细节。

在实际开发时,你并不需要去理会组件的实现细节,你面对的是接口,面对接口工作。即使组件的开发者将组件的实现替换掉了,而接口不变,你的程序也不需要变动。接口,就像一个标准一样,让我们去遵从这个标准。之前做的一个项目就是替换一个组件的实现层,而对于接口,则不需要进行变更。

简单的实现

通过一个简单的例子来理解接口:

复制代码代码如下:

/*
** FileName     : SimpleInterfaceDemo
** Author       : Jelly Young
** Date         : 2013/12/11
** Description  : More information, please go to http://www.jb51.net
*/
#include <iostream>
#include <combaseapi.h>
using namespace std;
interface IExample1
{
     virtual void __stdcall Fx1() = 0;
     virtual void __stdcall Fx2() = 0;
};
interface IExample2
{
     virtual void __stdcall Fy1() = 0;
     virtual void __stdcall Fy2() = 0;
};
// Implementation
class CImplementation : public IExample1, public IExample2
{
public:
     // Implementation IExample1
     void __stdcall Fx1() { cout<<"CImplementation::Fx1"<<endl; }
     void __stdcall Fx2() { cout<<"CImplementation::Fx2"<<endl; }
     // Implementation IExample2
     void __stdcall Fy1() { cout<<"CImplementation::Fy1"<<endl; }
     void __stdcall Fy2() { cout<<"CImplementation::Fy2"<<endl; }
};
// Client
int main()
{
     cout<<"Create an instance of the component."<<endl;
     CImplementation *pCImplementation = new CImplementation;
     // Get the IExample1 pointer
     IExample1 *pIExample1 = pCImplementation;
     // Use the IExample1 interface
     pIExample1->Fx1();
     pIExample1->Fx2();
     // Get the IExample2 pointer
     IExample2 *pIExample2 = pCImplementation;
     // Use the IExample2 pointer
     // Use the IExample2 interface
     pIExample2->Fy1();
     pIExample2->Fy2();
     // Destroy the component
     if (pCImplementation != NULL)
     {
          delete pCImplementation;
          pCImplementation = NULL;
          pIExample1 = NULL;
          pIExample2 = NULL;
     }
}

上面的例子中,client通过两个接口pIExample1和pIExample2来和组件进行通信。在声明接口时,使用了两个纯抽象基类IX和IY。总结上面代码的关键之处在于:

1.COM接口在C++中是用纯抽象基类实现的;
2.一个COM组件可以提供多个接口;
3.一个C++类可以使用多继承来实现一个可以提供多个接口的组件。

细节剖析

interface这货是从哪里来的?你会很好奇,是不是好奇的连下巴都掉下来了?C++也有interface关键字?不错,这个关键字是在combaseapi.h头文件中定义的,定义如下:

复制代码代码如下:

#define __STRUCT__ struct
#define interface __STRUCT__

说白了,就是用C++的关键字struct定义的一个结构体。使用struct定义有什么好处呢?首先需要搞清楚struct和class的区别。学了Java和C#的都知道,由于接口中定义的都是允许客户调用的,所以在接口中就不需要private和protected的了,如果使用class,而必须还要使用public关键字强调接口的公有属性,而struct默认的都是公有属性,这样就省去了添加public关键字的麻烦。

__stdcall是什么?__stdcall是一种用来修饰函数的关键字,主要约定了两件事情:

1.参数传递顺序,__stdcall表示参数从右向左压入堆栈;
2.调用堆栈由谁(调用函数或被调用函数)清理,__stdcall表示由被调用函数修改堆栈。

接口是由纯虚函数实现的,为什么是要这样?以及展现出来的多态,这个说来话长,我将在下一篇博文中进行总结。

总结

在这里对接口基础知识进行了扫盲式的总结,而这些简单的知识点也是日后开发中会经常遇到的,这里把这些东西掌握好了,等日后开发时也会感到很轻松。希望大家能从这篇博文中学到一定的知识,同时也希望大家对我的博客提一些中肯的建议。

C++ COM编程之什么是接口相关推荐

  1. Java编程笔记6:接口

    Java编程笔记6:接口 图源:PHP中文网 在Java中,接口可能只是特指使用interface关键字声明的一种抽象类型,但实际上在UML或者OOP中,接口往往是作为一种底层抽象概念而言的,其具体实 ...

  2. C#高级编程——C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)——图文详解加源码

    C#高级编程--C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)--图文详解加源码 前言

  3. java设计一个形状shape_编程定义一个图形接口 Shape, 内含2个抽象方法 get... JAVA编程题:编一个程序包含一个接口 shape(该接......

    导航:网站首页 > 编程定义一个图形接口 Shape, 内含2个抽象方法 get... JAVA编程题:编一个程序包含一个接口 shape(该接... 编程定义一个图形接口 Shape, 内含2 ...

  4. 网络编程(基于socket接口技术的进程间通信)接上一篇文章补充

    目录 一.网络编程(基于socket接口技术) 1.基于TCP协议的网络通信 编程模型: 2.基于UDP通信协议的网络通信 编程模型: 3.新增函数: 大小端数据转换函数: ip地址转换函数: TCP ...

  5. 可编程控制、微机接口及微机应用综合实验台

    ZN-PLC3可编程控制.微机接口及微机应用综合实验台 一.概述 PLC可编程控制器及微机接口及微机应用综合实验设备是,做到一机多用.资源共享.便于管理.这一崭新的系统实现了专业基础课(模拟.数字电路 ...

  6. 可编程定时器/计数器(微机接口技术)

    微型计算机原理与接口技术 文章目录 微型计算机原理与接口技术 可编程定时器/计数器 可编程定时/计数器接口芯片8253 (和8254差不多) 功能 定时或计数实现方法 基本原理 8253的内部结构 8 ...

  7. java 如何只暴露接口_Java并发异步编程,原来十个接口的活现在只需要一个接口就搞定...

    什么?对你没有听错,也没有看错 ..多线程并发执行任务,取结果归集~~ 不再忧愁-. 引言 先来看一些APP的获取数据,诸如此类,一个页面获取N多个,多达10个左右的一个用户行为数据,比如:点赞数,发 ...

  8. Java并发异步编程,原来十个接口的活现在只需要一个接口就搞定!

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:锦成同学 juejin.im/post/5d3c46d2f265da1b9163db ...

  9. Java 并发异步编程,原来十个接口的活现在只需要一个接口就搞定!

    引言 多线程并发执行任务,取结果归集 状态 队列 CAS操作 实战演练 总结 小甜点 什么?对你没有听错,也没有看错 ..多线程并发执行任务,取结果归集~~ 不再忧愁....感谢大家的双击+点赞和关注 ...

  10. 遨博协作机器人高级编程 -AUBOPE SDK Python接口介绍与使用

    目录 一.简介 二.环境版本 三.Python SDK接口简介 1.Python SDK接口数据 2. Python SDK接口函数示例 四.任务实施 五.任务拓展 一.简介 大家好,本篇文章主要针对 ...

最新文章

  1. oracle数据库性能awr,常见问题:如何使用AWR报告来诊断数据库性能问题
  2. [Nginx] Nginx 配置location总结
  3. 服务器挂起文件怎么删除,撤消挂起的更改或查看挂起的更改的列表
  4. 咕咚技术总监唐平麟:神策使我们的数据平台成本降低约 75%,迭代效率提升 2~3 倍...
  5. Web 第二阶段Java Script (续)
  6. 【报告分享】2020年重点行业薪酬趋势指南.pdf(附下载链接)
  7. PHP xdebug API接口优化揪出了getimagesize这个鬼
  8. FRR BGP协议分析15 -- 路由策略
  9. 使用TiledMap做的圈地游戏
  10. Keil v5安装和使用
  11. 深蓝英文字幕助手(一款看原声影片和英文字幕学英语的小软件)发布
  12. 【论文】开放域段落检索的句子感知对比学习
  13. 食品加工行业MES与APS的应用
  14. 计算机如何开启多个用户,电脑上如何打开多个微信账号?
  15. 史上最全视觉SLAM资料及研究方向思路汇总
  16. Ant Design Mobile是什么?
  17. 实现 JavaScript 哈希算法 包含 md5, sha1 sha256
  18. 【好玩的策略模拟经营游戏】造物主 Reus for Mac
  19. 【JS】使用onclick方法把对象本身传输给方法
  20. 百度地图根据经纬度计算距离php,详解js根据百度地图提供经纬度计算两点距离...

热门文章

  1. OutputStreamWriter介绍代码实现
  2. Fanout交换器-编写生产者
  3. Oracle之垂直水平分库分表(一)
  4. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...
  5. 响应文件是不是标书_什么是标书?投标书有哪些分类?标书和投标书的不同?...
  6. 大屏技术演进-推模式
  7. 26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)
  8. matplotlib.pyplot---------Python强大的绘图功能软件
  9. WindowsPhone7开发简单豆瓣网应用程序之界面设计
  10. 想自己造无人机吗?Intel推出基于 Linux x86的自助无人机开发板