参考文档:http://www.vckbase.com/index.php/wv/1604 (注:本文的大部分内容都是从该文章中获取)
BSTR字符串是COM技术的基石,CComBSTR是处理BSTR字符串的利器,深入理解BSTR字符串是研究COM技术必须经过的关口。
BSTR是“Basic String”的简称,微软在COM/OLE中定义的标准字符串数据类型。
typedef
wchar_t
WCHAR
;
typedef
WCHAR
OLECHAR;
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字符串
4、SysReAllocStringLen函数是在已有的字符串的基础上按指定长度重新分配一个新的BSTR字符串。
7、SysStringByteLen求一个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 转载请标明来源