Michael's Space

Technology changes the world, serves the people.
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

COM数据类型

Posted on 2006-10-05 18:26 奔跑的阿甘 阅读(2050) 评论(0)  编辑 收藏 引用 所属分类: COM/ATL
COM数据类型
Michael 2006年10月5日

本文根据DON BOX大师《Essential COM》第2.11章节文章,对COM中IDL的数据类型的用法进行了总结。

IDL数据类型的设计思想是要保证类型的“语言独立”和“平台独立”,例如它需要能被C++/VB/Java等语言和Windows(各版本)和Solaris等平台识别和支持。

1。基本类型
全是小写的字符表示。
包括:boolean, byte, small, short, long, hyper, float, double, char, wchar_t, enum, 接口指针。这些类型我们并不陌生。

2。OLECHAR类型
这是COM中的字符类型。例如:HRESULT Method([in,string] const OLECHAR* pwsz);"string"属性表示pwsz是个OLECHAR数组。
在WIN32/Solaris平台上OLECHAR只是简单地被定义为wchar_t类型。
我们可以通过COM提供的宏OLESTR把一个普通的字符串转换为OLECHAR*类型:const OLECHAR *pwsz = OLESTR("Hello")。

WIN32提供的TCHAR类型随着预编译宏的定义而不同,为防止代码的冗余繁琐,Don Box大师编写了相关类和函数,用于把TCHAR*类型转换为OLECHAR*类型。
ustring.h提供了_U,_UNCC类用于把TCHAR*类型转换为OLECHAR*类型,并提供了ustrncpy等串操作的重载版本(接受char,wchar_t为参数类型)。



3。BSTR
BSTR是一个LENGTH-PREFIXED,NULL-TERMINATED的OLECHAR字符串。
在JAVA,VB中使用的COM接口文本参数都是BSTR类型。

BSTR的内存管理问题:COM提供了若干API用于分配释放BSTR内存,包括:
BSTR内存管理函数

BSTR的内存由谁分配:若BSTR作为接口方法的传入参数,则调用方负责分配和释放;若作为传出参数,则接口对象负责分配,调用方负责释放。
当BSTR作为传入参数时,可采用以下类似前面_U,_UNCC的_UBSTR类来简化代码:
_UBSTR



4。VARIANT, VARIANTARG
    VARIANT是个UNION类型,它容纳前面提到的基本类型中的一个子集类型,具体支持哪个类型由对应的鉴别器指定,如VT_I2对应short类型。
    VARIANTARG作为方法参数,VARIANT作为方法结果,但是两个是同一个联合,仅仅名称不同而已。

VARIANT管理函数

 

EXAMPLE 1

 

EXAMPLE 2

5。COM接口
COM接口也可以作为方法参数进行传递,如:
HRESULT GetObject([out] IDog **ppDog);
HRESULT GetObject([in] REFIID riid, [out, iid_is(riid)] IUnknown **ppv);
HRESULT GetObject([in] REFIID riid, [out, iid_is(riid)] void **ppv); (优先选择)

【完】


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理