关于BSTR类数组
BSTR类型的实质是指向一个带长度前缀的OLECHAR字符数组的指针。ide
BSTR是指针数据类型。它指向数组的第一个字符,长度是以整数存储的数据中紧接第一个字符前面的位置。函数
BSTR中的字符数组以NUL字符结束。工具
前缀长度以字节单位,描述的是字符串的长度,该长度不包括终止字符NUL。指针
字符数组内部能够包括有效的NUL字符。开发
BSTR必须使用SysAllocString和SysFreeString函数族进行分配和释放。字符串
NULL的BSTR指针表示空字符串。简单讲就是BSTR *p = NULL 等同于 BSTR *p = "";原型
BSTR是非引用计数的,两次引用同一字符串的内容必须指向两个单独的BSTR,也就是说BSTR自己实现的是深拷贝。it
关于CComBSTR类class
CComBSTR是ATL的工具类,它封装了COM字符串数据类型BSTR,CComBSTR的定义参见“atlcomcli.h”。
CComBSTR的部分定义以下:
class CComBSTR
{
public:
BSTR m_str;
...
}
其中,维护的数据成员只有一个BSTR,为了和其余的字符串类转换和提升通用性,CComBSTR共提供了八个构造函数,以下:
CComBSTR() //将m_str初始化为NULL
CComBSTR(LPCOLESTR pSrc) //用LPCOLESTR初始化m_str
CComBSTR(int nSize, LPOLESR sz)//去LPOLESTR前nSize个字符初始化m_str
CComBSTR(int nSize) //初始化m_str的空间为nSize
CComBSTR(LPCSTR pSrc)//用LPCSTR字符串初始化m_str
CComBSTR(int nSize, LPCSTR sz)//用LPCSTR的前nSize个字符初始化m_str
CComBSTR(const CComBSTR& src) //拷贝构造函数
BSTR字符串在应用上并非新的应用,而是有很长历史了,在VB(在上大学时第一个商业程序就是用VB开发的,因此对于VB程序当时是情有独钟,对于内部原理也算略知一二)和JAVA(JAVA是大学的课程虽然讲的很少,但也用其作过一些小的应用和项目,一些皮毛的东西还算了解)中的字符串类型都用的BSTR。不过在C++中用BSTR就不是那么方便了,若是想将BSTR类型的字符串转换为C++能用的char*类型,其实也不用本身写转换函数或转换类,不少IDE环境就有现成的类库支持,下面介绍一种简单方便的:
#include "comutil.h"
#pragma comment(lib, "comsupp.lib")
::_com_util::ConvertBSTRToString(BSTR类型的变量)
::_com_util::ConvertStringToBSTR(const char*类型)
具体的函数原型以下:
// Convert char * to BSTR
//
BSTR __stdcall ConvertStringToBSTR(const char* pSrc) throw(_com_error);
// Convert BSTR to char *
//
char* __stdcall ConvertBSTRToString(BSTR pSrc) throw(_com_error);
至于函数的具体参数和使用细节,只要写入IDE环境后,自动的代码提示会帮你解决这些问题。