BSTR(Basic String[1])是一种Pascal-Style字符串(明确标示字符串长度)和C-Style字符串(以\0结尾)的混合物,一般用于COM中,是Unicode字符串,即标示字符串长度,最后还有一个值为\0字节。

对于BSTR,NULL与""有相同的语义(Visual Basic引入的语义)。BSTR的长度不包含结尾的\0字节。BSTR必须用SysAlloc*操作系统API申请与释放。

引论

编辑

C-Style 字符串

编辑

C程序语言本身原并不支持字符串数据结构。字符串通常以一个字符数组(或称数组)或一个指向字符资料的指针来表达。由于C语言的数组不包含其长度的资讯,故亦无法表示所载之字符串之长度。C语言社群对此通用之解决方案为于字符串末端增添一数值0的字符。C语言的标准程序库中的字符串处理功能亦以此为基础。C-Style 字符串特点为不直接包含长度资讯。要获取字符串之长度,就必须从头到尾数算字符数目,直到遇到字符0为止。由于不设长度资讯,故C-style 字符串的长度理论上可以无上限。

Pascal-style 字符串

编辑

Pascal程序语言采取另一种方向处理字符串。在存储字符串的记忆空间的开首,存储一固定长度整数以表达其长度。如此Pascal-style 字符串不需要在最后增添额外字符以标明其结束。但由于字符串开首存储字符串长度的空间有限,故Pascal-style 的字符串长度有上限。但在获得字符串长度方面有速度优势。

BSTR 字符串

编辑

BSTR 字符串结合了C-style 字符串和Pascal-style字符串。它在前4字节存储了字符串长度(字符串的字节数,但不包括Null结束符),在字符串结尾以字符0识别。和pascal-style 字符串不同,指向BSTR字符串的指针指向第一个字符,而非开首的字符串长度。故此适用于读取C-style 字符串的程序库同样适用于BSTR字符串(但写入则另作别论)。 字符是按照Unicode编码保存。允许在BSTR串中间嵌入NULL字符。

Windows提供了BSTR相关函数:

  • 分配空间并初始化BSTR,这也相当于char*转换成BSTR:例如,BSTR bstrText = ::SysAllocString(L"Test");
  • BSTR SysAllocString(const OLECHAR * psz);
  • INT SysReAllocString(BSTR* pbstr,const OLECHAR* psz);
  • BSTR SysAllocStringLen(const OLECHAR * strIn, UINT ui);
  • INT SysReAllocStringLen(BSTR* pbstr,const OLECHAR* psz,unsigned int len);
  • void SysFreeString(BSTR bstrString);
  • UINT SysStringLen(BSTR); //长度是指字符串中字符个数,而非字节数
  • UINT SysStringByteLen(BSTR bstr); 长度是指字符串中字节数
  • BSTR SysAllocStringByteLen(LPCSTR psz,UINT len);
  • 使用_variant_t把char*转换成BSTR:例如,_variant_t strVar("This is a test"); BSTR bstrText = strVar.bstrVal;
  • 使用_bstr_t函数,例如: BSTR bstrText = _bstr_t("This is a test");
  • 使用ATL中专门用于操作BSTR字符的CComBSTR类:例如BSTR bstrText = CComBSTR("This is a test");
  • 使用ConvertStringToBSTR。例如: char* lpszText = "Test"; BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
  • 使用ConvertBSTRToString:例如,char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
  • 使用_bstr_t的类型转换运算符重载把BSTR转换成char*:例如, char* lpszText2 = bstrText;
  • CString转换成BSTR通常是通过使用CStringT::AllocSysString来实现。例如:CString str("This is a test");BSTR bstrText = str.AllocSysString();
  • BSTR转换成CString,例如:CStringA str=bstrText;

参考文献

编辑
  1. ^ Basic String的意思是Basic语言的字符串,见《Eric’s Complete Guide To BSTRSemantics》 by Eric Lippert, 2003年9月12日. [2018年9月9日]. (原始内容存档于2018年9月9日).