跳至內容

BSTR

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

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日).