BSTR/CComBSTR字符串的结构和用法

来源:互联网 发布:手机midi制作软件 编辑:程序博客网 时间:2024/04/30 01:32

参考文档:http://www.vckbase.com/index.php/wv/1604 (注:本文的大部分内容都是从该文章中获取)

 

BSTR字符串是COM技术的基石,CComBSTR是处理BSTR字符串的利器,深入理解BSTR字符串是研究COM技术必须经过的关口。

BSTR是“Basic String”的简称,微软在COM/OLE中定义的标准字符串数据类型。

typedefwchar_tWCHAR;

typedefWCHAROLECHAR;

typedef  OLECHAR *BSTR;

相当于 typedef   wchar_t  *BSTR;    从存储结构上可以看出BSTR为wchar_t 的字符串

 

BSTR的存储结构为:

1. 字符串头      ---4字节  存储了包好字节(Byte)的个数

2. 字符串内容 ---以unicode方式存储,每个字符两字节(w_char - 2byte)

3. 结束符          ---结束符null, 2字节

使用下面语句可以查询出字符串头,从而获取BSTR存储内容的字节数

printf("bstr front 4 byte is %x",*((int*)(((int*)bstr-1))));

 

为处理BSTR字符串,微软在OleAuto.h中定义了BSTR API,分别是:

BSTR SysAllocString(const OLECHAR * psz);                                 // 使用w_char串创建一个BSTR字符串INT  SysReAllocString(BSTR* pbstr,const OLECHAR* psz);                    // 重置BSTR里的内容BSTR SysAllocStringLen(const OLECHAR * strIn, UINT ui);                   // 创建一个指定长度的BSTR串INT  SysReAllocStringLen(BSTR* pbstr,const OLECHAR* psz,unsigned int len);// 重置BSTR里的内容
void SysFreeString(BSTR bstrString);                                      // 释放BSTR UINT SysStringLen(BSTR);                                                  // 获取字符串长度UINT SysStringByteLen(BSTR bstr);                                         // 获取字符串字节长度BSTR SysAllocStringByteLen(LPCSTR psz,UINT len);                          // 创建BSTR串


 

下面对上述API用法进行说明。

1、SysAllocString函数用于创建一个BSTR字符串,如:BSTR bstr=SysAllocString(L"create bstr string");就创建了一个BSTR字符串

2、SysReAllocString用于在一个已有的BSTR字符串的基础上重新建立一个BSTR字符串

3、SysAllocStringLen按照指定的长度分配一个BSTR字符串,例如:
    BSTR bstr=SysAllocStringLen(L"create bstr string",6);
虽然“create bstr string”的长度是18个字符但此语句只分派6个字符的BSTR串。

4、SysReAllocStringLen函数是在已有的字符串的基础上按指定长度重新分配一个新的BSTR字符串。

5、SysFreeString是释放一个BSTR字符串,BSTR字符串用后必须用此函数进行释放
6、SysStringLen求一个BSTR字符串的长度,其长度是指字符串中字符个数,而非字节数。

7、SysStringByteLen求一个BSTR字符串的字节长度

8、SysAllocStringByteLen是按字节长度分配一个BSTR字符串。

 

以上大致就是BSTR API 的用法,为了方便操作BSTR字符串,在ATL中建立了CComBSTR类专门用于操作BSTR字符,下面大致说说该类的用法。

CComBSTR类维护了公有的BSTR类型成员变量m_str,定义了8个构造函数用于创建CComBSTR对象,在析构函数中释放了m_str,在类中定义了常用的操作符并提供了对象持久性支持。

1、构造一个CComBSTR对象

CComBSTR bstr1;  创建一个空的CComBSTR 对象,内容为空""

CComBSTR bstr2(L"this is a BSTR string"); 创建一个包含"this is a BSTR string"字符串的CComBSTR对象

CComBSTR bstr3(5); 创建一个初始长度为5,内容为"     "的CComBSTR对象。

CComBSTR bstr4(3,L"this is a BSTR string"); 创建一个长度为3的CComBSTR对象,内容为"thi"

ComBSTR bstr2(bstr1); 通过bstr1构造bstr2

static const GUID GUID_Sample={0X8a44e110,0xf134,0x11d1,{0x96,0xb1,0xba,0xdb,0xba,0xdb,0xad,0xcc}}; 

CComBSTR bstr1(GUID_Sample);  通过GUID构造

2、CComBSTR定义的常用操作如下

(1)“=”操作符(赋值操作)

(2)BSTR操作符把CComBSTR对象显式的或隐式的转换成BSTR字符串

(3)!= 操作符,用来直接比较两个CComBSTR对象

3、CComBSTR定义的常用方法如下

 (1)Copy 方法,该方法拷贝CComBSTR对象中的BSTR字符串并返回BSTR字符串

(2)CopyTo 方法将CComBSTR对象中的BSTR字符串拷贝到新的位置

(3)Attach方法把一个BSTR字符串附加到CComBSTR对象上

(4)Detach方法分离BSTR字串与CComBSTR对象

(5)Empty 方法,释放对象中的BSTR字符串


  

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请标明来源 

 

原创粉丝点击