bstr java_BSTR详解一 -BSTR简介和内部结构
http://blog.csdn.net/pkrobbie/archive/2007/01/18/1486331.aspx
COM是一種跨編程語(yǔ)言的平臺(tái),需要提供語(yǔ)言無(wú)關(guān)的數(shù)據(jù)類(lèi)型。多數(shù)編程語(yǔ)言有自己的字符串表示。
C++ 字符串是以0結(jié)束的ASCII或Unicode字符數(shù)組
Visual Basic字符串是一個(gè)ASCII字符數(shù)組加上表示長(zhǎng)度的前綴。
Java字符串是以0結(jié)束的Unicode字符數(shù)組。
需要定義一種通用的字符串類(lèi)型,可以很容易的匹配到不同編程語(yǔ)言。在C++中,就是BSTR。
"Basic STRing"的簡(jiǎn)稱(chēng),微軟在COM/OLE中定義的標(biāo)準(zhǔn)字符串?dāng)?shù)據(jù)類(lèi)型。對(duì)于C++,Windows頭文件wtypes.h中定義如下:
typedef?wchar_t?WCHAR;
typedef?WCHAR?OLECHAR;
typedef?OLECHAR?__RPC_FAR*BSTR;;
在COM中,字符用16-bit OLECHAR表示,這樣使COM可以支持各種code pages,包括Unicode。對(duì)于windows系統(tǒng),可以簡(jiǎn)單理解為OLECHAR使用的就是Unicode 。OLECHAR串與單字節(jié)字符串很類(lèi)似,是一個(gè)以null結(jié)尾的buffer。唯一的區(qū)別是每個(gè)字符占兩個(gè)字節(jié),而不是一個(gè)
0 1 2 3 4 5 6 7 8 9 0 1
| H | E | L | L | O | \0|
^
OLCHAR
Figure 1. Format of an OLECHAR string.
使用以Null結(jié)尾的簡(jiǎn)單字符串在COM component間傳遞不太方便。因此,標(biāo)準(zhǔn)BSTR是一個(gè)有長(zhǎng)度前綴和null結(jié)束符的OLECHAR數(shù)組。BSTR的前4字節(jié)是一個(gè)表示字符串長(zhǎng)度的前綴。BSTR長(zhǎng)度域的值是字符串的字節(jié)數(shù),并且不包括0結(jié)束符。由于是Unicode串,所以字符數(shù)是字節(jié)數(shù)的一半。這種方式的優(yōu)點(diǎn)是允許程序員在BSTR串中間嵌入NULL字符。但是,BSTR的前四個(gè)字節(jié)表示長(zhǎng)度,而OLECHAR數(shù)組的前四字節(jié)表示前兩個(gè)字符。這種情況下,對(duì)于C++程序,如何實(shí)現(xiàn)BSTR和OLECHAR的交換?答案是COM提供了兩個(gè)BSTR分配用的API:SysAllocString / SysReallocString。函數(shù)返回的指針指向BSTR的第一個(gè)字符,而不是BSTR在內(nèi)存的第一個(gè)字節(jié)。
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
0a000000 | H | E | L | L | O | \0|
^
BSTR
Figure 2.? Format of a BSTR.
下面是SysAllocString和SysFreeString的偽代碼。
只有在你不得不用的時(shí)候。
使用BSTR一般有以下幾種情況:
COM interface接口定義,并且不希望額外提供custom marshaling庫(kù)(MDIL生成或開(kāi)發(fā)人員自己訂制),必須使用BSTR傳遞字符串。使用C/C++類(lèi)型的字符串在COM DLL傳遞字符串,表面上可以使用,但違背了COM的基本規(guī)則,并且給以后的擴(kuò)展留下了隱患。例如,把一個(gè)In-process COM Object(簡(jiǎn)單說(shuō)COM DLL)改成out-of-process object(COM EXE)。理論上,客戶端的代碼應(yīng)該不做任何改變。但如果是用了C/C++字符串,又希望只使用系統(tǒng)的automation mashaller(Oleaut32.dll),就會(huì)出錯(cuò)。
如果可以提供custom marshaling,也推薦使用BSTR。
客戶要求接口必須使用BSTR,和客戶討論后,不能修改。
使用的外部庫(kù)的接口使用BSTR
不使用的情況:
不推薦在IDL結(jié)構(gòu)體中定義BSTR成員,會(huì)給結(jié)構(gòu)體的復(fù)制和釋放帶來(lái)麻煩。最好直接使用限定最大長(zhǎng)度的TCHAR數(shù)組。如果確實(shí)需要傳遞變長(zhǎng)字符串,BSTR應(yīng)該被定義成獨(dú)立的參數(shù)或者使用獨(dú)立的get/set接口。
盡可能縮小的BSTR及相關(guān)類(lèi)型的作用域范圍。類(lèi)的成員變量和函數(shù)參數(shù)不使用BSTR。局部變量要盡快釋放類(lèi)的內(nèi)部不使用BSTR。代碼處理邏輯中只在接口直接相關(guān)部分使用BSTR。接收到一個(gè)BSTR時(shí),盡量立刻變成C/C++的字符串副本進(jìn)行處理。在需要傳遞BSTR參數(shù)前產(chǎn)生BSTR,用過(guò)立即釋放。
字符串相關(guān)類(lèi)型的推薦選擇順序
優(yōu)先級(jí)
類(lèi)型
說(shuō)明
最高
stl::string/wstring
· 功能最完善,可移植性最好。
CString
· 如果編碼規(guī)范限制使用STL的時(shí)候,推薦CString。
· VC 6的版本很不完善。.Net有明顯改進(jìn),需要進(jìn)一步研究。
C/C++ basic type(TCHAR* / char* / LPTSTR / LPCTSTR / TCHAR[])
· 在結(jié)構(gòu)體中,優(yōu)先使用指定最大長(zhǎng)度的字符數(shù)組。
· 效率最好
CComBSTR/ _bstr_t
· 在必須使用BSTR時(shí)的優(yōu)先選擇。
· 在ATL(COM component)工程或者工程中必須使用ATL中,優(yōu)先選擇CComBSTR。一般Exe/dll如果_bstr_t能滿足要求,優(yōu)先使用_bstr_t。
· 對(duì)于VC6,使用_bstr_t一定要慎重,最好只用作簡(jiǎn)單臨時(shí)變量保存調(diào)被調(diào)用函數(shù)的傳入?yún)?shù)。因?yàn)開(kāi)bstrt_t不能支持一些關(guān)鍵性操作,比如Detach。
· 對(duì)于VC++ .Net推薦使用_bstr_t,它是C++擴(kuò)展,不需要額外包含ATL的文件。
最低
BSTR
· COM接口
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的bstr java_BSTR详解一 -BSTR简介和内部结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java获取小数位数_Java获取小数位
- 下一篇: java bigdecimal语法_JA