第二章 接口

原创 2004年09月15日 10:58:00

再谈接口与实现

用户可以选择任何一个C++编译器,但最终他们必须要使用一个C++(而不是其它语言)的编译器.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

COM提供了这样一种语言,它只用了大家都很熟悉的C语言的语法,同时加入了某些用于消除C语言中二义性的能力,称接口定义语言

IDL (Interface Definition Language)

COM IDL OSFDCE RPC IDL 为基础加入与COM相关的扩展(继承,多态)

MIDL.EXEIDL编译器,

产生C/C++兼容的头文件

产生一个二进制文件,称类型库文件

方法与效果

每个COM方法返回一个HRESULT,

分成三部分:严重程度位,操作码和信息码

HRESULT指示一个不正常的结果,Java虚拟机会抛出异常,

C++则要手工检查HRESULT.

接口与IDL

IDLinterface 关键字定义接口

定义:接口名,基接口名,接口体,接口属性

每个COM接口都至少有两个属性:一个是[object] 表明是COM 而不是DCE风格的接口; 一个是接口的实际名字[uuid]

GUID是一个128位的大数,可以保证在时间和空间范围内都是唯一的,标准文本格式用于[uuid]

 

IUnknown

方法: QueryInterface(), AddRef(), Release();

IUnknown是所有接口的根源

COM禁止多重接口继承,但实现可以暴露多个接口

 

资源管理与IUnknown

COM的引用计数规则:

1.当一个非空接口指针从一个内存位置拷贝到另一个内存位置时,调用AddRef();

2. 对已经包含非空接口指针的内存位置而言,在复写内存之前要调用Release();

3.如果可能,多余的AddRef()Release()可以被优化掉;

调用规则:

AddRef()

A1 当把一个非空接口指针写到局部变量时;

A2 当被调用方把一个非空接口指针写到方法或者函数的[out][in, out]参数中时

A3 当被调用方返回一个非空接口指针作为函数的实际结果时

A4 把一个非空接口指针写到对象的一个数据成员时

Release ()

R1 改写一个非空局部变量或者数据成员之前

R2 离开非空局部变量的作用域之前

R3 被调用方要改写方法或者函数的[in, out]参数,且参数初始值非空时

R4 改写对象非空数据成员之前

R5 离开对象析构函数之前

特殊规则

S1 调用方把一个非空接口指针通过[in]参数传给函数时,不必调用AR

类型强制转换与IUnknown

HRESULT QueryInterface([in] REFIID riid, [out] void **ppv);

若对象不支持所请求的接口类型,那么ppv置为null, 返回E_NOINTERFACE

若支持,则改写指针, 返回S_OK,调用AddRef();

AddRef Release不是针对整个对象的操作,而是针对接口指针的操作

Void**导致的类型不安全性漏洞,可用宏IID_PPV_ARG解决

实现IUnknown

AddRef()Release()

类定义中的析构函数为protected,保证对象总是在堆上创建,delete this总是正确的.

但有时我们希望对象不是在堆中分配,这时引用计数可进行优化,返回一个参考值

QueryInterface()

当一个请求被多个接口支持时,类型转换操作必须明确选择一个更为精确的基类

使用COM接口指针

因为COM对应的C++语言映射没有提供runtime layer, C++程序员必须显示地使用IUnknown的方法,但这样代码效率更高

Java VB而言, IUnknown 的细节隐藏在虚拟机之后.

智能指针可以使在C++中使用COM接口指针的操作简化.

但它也带来许多问题.

优化QueryInterface

每个COM兼容的类都提供了一个表格,通过固定的偏移或其它技术,把该类所支持的IID映射到对象的某个地方.

(类似于MFC中的消息映射宏)

数据类型

OLECHARTCHAR的转换

BSTR:字符串类型

IDLCOM也支持联合(Union),为保证解释不存在二义性,要提供全个鉴别器

COM提供了一个通用的,通过鉴别的联合给VB使用,VARIANT

COM的接口也可以作为参数进行传递: 静态或动态

IDL属性与COM属性

指明一个对象具有某些公开可见的属性,并可通过COM接口来访问或修改这些属性天有些情况下是很有用的.

COM IDL允许接口的方法上加上一些注释,反映该方法可用于读写对象的某个属性

异常

COM的异常API: 抛出SetErrorInfo() 捕捉异常GetErrorInfo();

COM异常对象必须支持IErrorInfo接口

抛出异常的对象必须实现IsupportErrorInfo接口,以便确定哪个接口支持异常

COM要求禁止"纯C++异常"传播到方法的边界之外

【Spring】【笔记】《Spring In Action》第二章 Bean装配

2.1 声明Bean 2.1.1 创建Spring配置 XML文件方式注解方式      在XML文件中声明Bean时,Spring配置文件的根元素是来源于Spring beans 命名空间所定义的...
  • KEY0323
  • KEY0323
  • 2016年05月22日 16:50
  • 484

思科CCNA第一学期第二章答案

001 TCP/IP 网络接入层有何作用? 路径确定和数据包交换 数据表示、编码和控制 可靠性、流量控制和错误检测 详细规定构成物理链路的组件及其接入方法 将数据段划分为数据包 ...
  • u014253173
  • u014253173
  • 2015年01月01日 21:04
  • 3902

CSAPP深入理解计算机系统第二章学习笔记(1)

1、可以利用数字的算数右移,然后利用0XFF这样的数字做掩码运算,可以获取到一个数字的符号位。计算机的移位运算有一种很重要的作用就是利用掩码运算去提取一个位模式的一段信息。 2、在C语言中的条件语句,...
  • u010092734
  • u010092734
  • 2014年07月15日 22:33
  • 1677

统计学习方法笔记--第二章感知机perceptron

统计学习方法笔记–第二章感知机perceptron感知机是二类分类的线性分类算法模型 1.模型 其中w为权值,b为偏置。 为向量内积, 对应于超平面,w是法向量,b是截距 如果输入数据集X是...
  • Selectnew
  • Selectnew
  • 2016年10月10日 13:56
  • 577

编程珠玑第二章习题

1、提供单词和词典,找到该单词的所有变位词,可以事先花时间和空间处理下该词典。 因为要查找变位词,事先遍历词典,得到每个单词签名,并建立签名列表,签名列表的每个项包含了该签名的所有单词。有了这个列表,...
  • chenzujie
  • chenzujie
  • 2013年08月10日 11:57
  • 1819

【算法竞赛入门经典】【第二章】课后习题

《 算法竞赛入门经典》课后题解,第二发来袭。持续更新中。。。
  • luomingjun12315
  • luomingjun12315
  • 2015年04月08日 14:04
  • 1683

数据库应用系统 第二章上机1-4

private void button1_Click(object sender, EventArgs e) { if (InsertStudent()) ...
  • qq_36074043
  • qq_36074043
  • 2016年12月07日 19:31
  • 152

统计学习方法-第二章

第二章:感知机算法 感知机是二分类的线性模型,输入实例的特征向量,输出实例的±类别。模型表达如下: w·x表示向量w和x的内积。sign是一个映射函数,由线性变换到输出空间(+1,-1)的一个映...
  • tiangcs
  • tiangcs
  • 2017年02月24日 01:55
  • 174

02 快学scala第二章习题答案

2 控制结构和函数   2.1 一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如果为0,则signum为0.编写一个函数来计算这个值 简单的逻辑判断 def...
  • china_demon
  • china_demon
  • 2016年08月14日 19:29
  • 362

ACCP7.0S2深入.NET和C#编程第二章上机1,2

-------上机1 class 上机1 { static void Main(string[] args) { int[] oldp...
  • baidu_36074048
  • baidu_36074048
  • 2017年02月06日 17:11
  • 1134
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第二章 接口
举报原因:
原因补充:

(最多只允许输入30个字)