C++ COM编程之什么是接口
什么是接口?
说到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编程之什么是接口相关推荐
- Java编程笔记6:接口
Java编程笔记6:接口 图源:PHP中文网 在Java中,接口可能只是特指使用interface关键字声明的一种抽象类型,但实际上在UML或者OOP中,接口往往是作为一种底层抽象概念而言的,其具体实 ...
- C#高级编程——C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)——图文详解加源码
C#高级编程--C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)--图文详解加源码 前言
- java设计一个形状shape_编程定义一个图形接口 Shape, 内含2个抽象方法 get... JAVA编程题:编一个程序包含一个接口 shape(该接......
导航:网站首页 > 编程定义一个图形接口 Shape, 内含2个抽象方法 get... JAVA编程题:编一个程序包含一个接口 shape(该接... 编程定义一个图形接口 Shape, 内含2 ...
- 网络编程(基于socket接口技术的进程间通信)接上一篇文章补充
目录 一.网络编程(基于socket接口技术) 1.基于TCP协议的网络通信 编程模型: 2.基于UDP通信协议的网络通信 编程模型: 3.新增函数: 大小端数据转换函数: ip地址转换函数: TCP ...
- 可编程控制、微机接口及微机应用综合实验台
ZN-PLC3可编程控制.微机接口及微机应用综合实验台 一.概述 PLC可编程控制器及微机接口及微机应用综合实验设备是,做到一机多用.资源共享.便于管理.这一崭新的系统实现了专业基础课(模拟.数字电路 ...
- 可编程定时器/计数器(微机接口技术)
微型计算机原理与接口技术 文章目录 微型计算机原理与接口技术 可编程定时器/计数器 可编程定时/计数器接口芯片8253 (和8254差不多) 功能 定时或计数实现方法 基本原理 8253的内部结构 8 ...
- java 如何只暴露接口_Java并发异步编程,原来十个接口的活现在只需要一个接口就搞定...
什么?对你没有听错,也没有看错 ..多线程并发执行任务,取结果归集~~ 不再忧愁-. 引言 先来看一些APP的获取数据,诸如此类,一个页面获取N多个,多达10个左右的一个用户行为数据,比如:点赞数,发 ...
- Java并发异步编程,原来十个接口的活现在只需要一个接口就搞定!
点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:锦成同学 juejin.im/post/5d3c46d2f265da1b9163db ...
- Java 并发异步编程,原来十个接口的活现在只需要一个接口就搞定!
引言 多线程并发执行任务,取结果归集 状态 队列 CAS操作 实战演练 总结 小甜点 什么?对你没有听错,也没有看错 ..多线程并发执行任务,取结果归集~~ 不再忧愁....感谢大家的双击+点赞和关注 ...
- 遨博协作机器人高级编程 -AUBOPE SDK Python接口介绍与使用
目录 一.简介 二.环境版本 三.Python SDK接口简介 1.Python SDK接口数据 2. Python SDK接口函数示例 四.任务实施 五.任务拓展 一.简介 大家好,本篇文章主要针对 ...
最新文章
- oracle数据库性能awr,常见问题:如何使用AWR报告来诊断数据库性能问题
- [Nginx] Nginx 配置location总结
- 服务器挂起文件怎么删除,撤消挂起的更改或查看挂起的更改的列表
- 咕咚技术总监唐平麟:神策使我们的数据平台成本降低约 75%,迭代效率提升 2~3 倍...
- Web 第二阶段Java Script (续)
- 【报告分享】2020年重点行业薪酬趋势指南.pdf(附下载链接)
- PHP xdebug API接口优化揪出了getimagesize这个鬼
- FRR BGP协议分析15 -- 路由策略
- 使用TiledMap做的圈地游戏
- Keil v5安装和使用
- 深蓝英文字幕助手(一款看原声影片和英文字幕学英语的小软件)发布
- 【论文】开放域段落检索的句子感知对比学习
- 食品加工行业MES与APS的应用
- 计算机如何开启多个用户,电脑上如何打开多个微信账号?
- 史上最全视觉SLAM资料及研究方向思路汇总
- Ant Design Mobile是什么?
- 实现 JavaScript 哈希算法 包含 md5, sha1 sha256
- 【好玩的策略模拟经营游戏】造物主 Reus for Mac
- 【JS】使用onclick方法把对象本身传输给方法
- 百度地图根据经纬度计算距离php,详解js根据百度地图提供经纬度计算两点距离...
热门文章
- OutputStreamWriter介绍代码实现
- Fanout交换器-编写生产者
- Oracle之垂直水平分库分表(一)
- python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...
- 响应文件是不是标书_什么是标书?投标书有哪些分类?标书和投标书的不同?...
- 大屏技术演进-推模式
- 26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)
- matplotlib.pyplot---------Python强大的绘图功能软件
- WindowsPhone7开发简单豆瓣网应用程序之界面设计
- 想自己造无人机吗?Intel推出基于 Linux x86的自助无人机开发板