閱讀101 返回首頁    go 阿裏雲 go 技術社區[雲棲]


BSTR內存結構

COM 中除了使用一些簡單標準的數據類型外,字符串類型需要特別重點地說明一下。還記得原則嗎?COM組件是運行在分布式環境中的。通俗地說,你不能直接把一個內存指針直接作為參數傳遞給COM函數。你想想,係統需要把這塊內存的內容傳遞到地球另一邊的計算機上,因此,我至少需要知道你這塊內存的尺寸吧?不然讓我如何傳遞呀?傳遞多少字節呀?!而字符串又是非常常用的一種類型,因此 COM設計者引入了BASIC中字符串類型的表示方式—BSTR,BSTR 其實是一個指針類型,它的內存結構是:(輸入程序片段 BSTR p = ::SysAllocString(L"Hello,你好");斷點執行,然後觀察p的內存)


BSTR
是一個指向UNICODE 字符串的指針,BSTR前的4個字節中,使用DWORD保存著這個字符串的字節長度(沒有含字符串的結束符)。因此係統就能夠正確處理並傳送這個字符串到地球另一邊了。特別需要注意的是,由於BSTR的指針就是指向UNICODE 串,因此BSTRLPOLESTR可以在一定程度上混用,但一定要注意:
有函數 fun(LPCOLESTR lp),則你調用BSTR p=fun(p); 正確
有函數 fun(const BSTR bstr),則你調用 LPCOLESTR p=fun(p);錯誤!!!
有關BSTR的處理函數:
 

API 函數

說明

SysAllocString()

申請一個BSTR指針,並初始化為一個字符串

SysFreeString()

釋放BSTR內存

SysAllocStringLen()

申請一個指定字符長度的BSTR指針,並初始化為一個字符串

SysAllocStringByteLen()

申請一個指定字節長度的BSTR指針,並初始化為一個字符串

SysReAllocStringLen()

重新申請BSTR指針

CString 函數

說明

AllocSysString()

CString 得到BSTR

SetSysString()

重新申請BSTR指針,並複製到 CString

CComBSTR 函數

ATL BSTR包裝類。在 atlbase.h 中定義

Append ()AppendBSTR()AppendBytes()ArrayToBSTR()BSTRToArray()AssignBSTR() Attach()Detach()Copy()CopyTo()Empty()Length()ByteLength() ReadFromStream()WriteToStream()LoadString()ToLower()ToUpper()
運算符重載:!,!=,==,<,>,&,+=,+,=

太多了,但從函數名稱不能看出其基本功能。詳細資料,查看MSDN 吧。另外,左側函數,有很多是 ATL 7.0 提供的,VC6.0 下所帶的 ATL 3.0 不支持。
由於我們將來主要用ATL開發組件程序,因此使用ATL CComBSTR 為主。VC也提供了其它的包裝類_bstr_t

最後更新:2017-04-02 00:06:17

  上一篇:go 關於Debug和Release之本質區別
  下一篇:go GNU make 指南