关于BSTR类

BSTR类型的实质是指向一个带长度前缀的OLECHAR字符数组的指针。

BSTR是指针数据类型。它指向数组的第一个字符,长度是以整数存储的数据中紧接第一个字符前面的位置。

BSTR中的字符数组以NUL字符结束。

前缀长度以字节单位,描述的是字符串的长度,该长度不包括终止字符NUL。

字符数组内部可以包括有效的NUL字符。

BSTR必须使用SysAllocString和SysFreeString函数族进行分配和释放。

NULL的BSTR指针表示空字符串。简单讲就是BSTR *p = NULL 等同于 BSTR *p = "";

BSTR是非引用计数的,两次引用同一字符串的内容必须指向两个单独的BSTR,也就是说BSTR本身实现的是深拷贝。

 

关于CComBSTR类

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环境后,自动的代码提示会帮你解决这些问题。