關於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環境後,自動的代碼提示會幫你解決這些問題。