BSTR記憶體結構

2021-04-12 20:03:43 字數 1258 閱讀 6575

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 中定義

太多了,但從函式名稱不能看出其基本功能。詳細資料,檢視msdn 吧。另外,左側函式,有很多是atl 7.0 提供的,vc6.0 下所帶的atl 3.0 不支援。

由於我們將來主要用atl開發元件程式,因此使用atl的ccombstr 為主。vc也提供了其它的包裝類_bstr_t。

BSTR詳解三 BSTR使用注意事項

1 how to use bstr 1.1 bstr 分析 bstr 設計對於 c 程式設計師好壞參半。一方面,bstr 可以被用於大多數需要 olechar 陣列作為引數的函式。另一方面,不能用熟悉的 c c 函式進行對 bstr 的分配 釋放和處理,例如 malloc,free,new,dele...

BSTR詳解三 BSTR使用注意事項

1 how to use bstr 1.1 bstr分析 bstr設計對於c 程式設計師好壞參半。一方面,bstr可以被用於大多數需要olechar陣列作為引數的函式。另一方面,不能用熟悉的c c 函式進行對bstr的分配 釋放和處理,例如malloc,free,new,delete,lstrcat...

BSTR詳解三 BSTR使用注意事項

2007 9 7 21 34 12 1 how to use bstr 1.1 bstr 分析 bstr 設計對於 c 程式設計師好壞參半。一方面,bstr 可以被用於大多數需要 olechar 陣列作為引數的函式。另一方面,不能用熟悉的 c c 函式進行對 bstr 的分配 釋放和處理,例如 ma...