BSTR內存結構
COM 中除了使用一些簡單標準的數據類型外,字符串類型需要特別重點地說明一下。還記得原則嗎?COM組件是運行在分布式環境中的。通俗地說,你不能直接把一個內存指針直接作為參數傳遞給COM函數。你想想,係統需要把這塊內存的內容傳遞到“地球另一邊”的計算機上,因此,我至少需要知道你這塊內存的尺寸吧?不然讓我如何傳遞呀?傳遞多少字節呀?!而字符串又是非常常用的一種類型,因此 COM設計者引入了BASIC中字符串類型的表示方式—BSTR,BSTR 其實是一個指針類型,它的內存結構是:(輸入程序片段 BSTR p = ::SysAllocString(L"Hello,你好");斷點執行,然後觀察p的內存)
BSTR是一個指向UNICODE 字符串的指針,BSTR前的4個字節中,使用DWORD保存著這個字符串的字節長度(沒有含字符串的結束符)。因此係統就能夠正確處理並傳送這個字符串到“地球另一邊”了。特別需要注意的是,由於BSTR的指針就是指向UNICODE 串,因此BSTR和LPOLESTR可以在一定程度上混用,但一定要注意:
有函數 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 不支持。
|
最後更新:2017-04-02 00:06:17