分享
 
 
 

第二章 接口

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

再谈接口与实现

用户可以选择任何一个C++编译器,但最终他们必须要使用一个C++(而不是其它语言)的编译器.

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

IDL (Interface Definition Language)

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

MIDL.EXE是IDL编译器,

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

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

方法与效果

每个COM方法返回一个HRESULT值,

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

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

而C++则要手工检查HRESULT.

接口与IDL

IDL用interface 关键字定义接口

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

每个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]参数传给函数时,不必调用A或R

类型强制转换与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中的消息映射宏)

数据类型

OLECHAR到TCHAR的转换

BSTR:字符串类型

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

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

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

IDL属性与COM属性

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

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

异常

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

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

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有