日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bstr java_BSTR详解一 -BSTR简介和内部结构

發布時間:2025/4/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bstr java_BSTR详解一 -BSTR简介和内部结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/pkrobbie/archive/2007/01/18/1486331.aspx

COM是一種跨編程語言的平臺,需要提供語言無關的數據類型。多數編程語言有自己的字符串表示。

C++ 字符串是以0結束的ASCII或Unicode字符數組

Visual Basic字符串是一個ASCII字符數組加上表示長度的前綴。

Java字符串是以0結束的Unicode字符數組。

需要定義一種通用的字符串類型,可以很容易的匹配到不同編程語言。在C++中,就是BSTR。

"Basic STRing"的簡稱,微軟在COM/OLE中定義的標準字符串數據類型。對于C++,Windows頭文件wtypes.h中定義如下:

typedef?wchar_t?WCHAR;

typedef?WCHAR?OLECHAR;

typedef?OLECHAR?__RPC_FAR*BSTR;;

在COM中,字符用16-bit OLECHAR表示,這樣使COM可以支持各種code pages,包括Unicode。對于windows系統,可以簡單理解為OLECHAR使用的就是Unicode 。OLECHAR串與單字節字符串很類似,是一個以null結尾的buffer。唯一的區別是每個字符占兩個字節,而不是一個

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結尾的簡單字符串在COM component間傳遞不太方便。因此,標準BSTR是一個有長度前綴和null結束符的OLECHAR數組。BSTR的前4字節是一個表示字符串長度的前綴。BSTR長度域的值是字符串的字節數,并且不包括0結束符。由于是Unicode串,所以字符數是字節數的一半。這種方式的優點是允許程序員在BSTR串中間嵌入NULL字符。但是,BSTR的前四個字節表示長度,而OLECHAR數組的前四字節表示前兩個字符。這種情況下,對于C++程序,如何實現BSTR和OLECHAR的交換?答案是COM提供了兩個BSTR分配用的API:SysAllocString / SysReallocString。函數返回的指針指向BSTR的第一個字符,而不是BSTR在內存的第一個字節。

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的偽代碼。

只有在你不得不用的時候。

使用BSTR一般有以下幾種情況:

COM interface接口定義,并且不希望額外提供custom marshaling庫(MDIL生成或開發人員自己訂制),必須使用BSTR傳遞字符串。使用C/C++類型的字符串在COM DLL傳遞字符串,表面上可以使用,但違背了COM的基本規則,并且給以后的擴展留下了隱患。例如,把一個In-process COM Object(簡單說COM DLL)改成out-of-process object(COM EXE)。理論上,客戶端的代碼應該不做任何改變。但如果是用了C/C++字符串,又希望只使用系統的automation mashaller(Oleaut32.dll),就會出錯。

如果可以提供custom marshaling,也推薦使用BSTR。

客戶要求接口必須使用BSTR,和客戶討論后,不能修改。

使用的外部庫的接口使用BSTR

不使用的情況:

不推薦在IDL結構體中定義BSTR成員,會給結構體的復制和釋放帶來麻煩。最好直接使用限定最大長度的TCHAR數組。如果確實需要傳遞變長字符串,BSTR應該被定義成獨立的參數或者使用獨立的get/set接口。

盡可能縮小的BSTR及相關類型的作用域范圍。類的成員變量和函數參數不使用BSTR。局部變量要盡快釋放類的內部不使用BSTR。代碼處理邏輯中只在接口直接相關部分使用BSTR。接收到一個BSTR時,盡量立刻變成C/C++的字符串副本進行處理。在需要傳遞BSTR參數前產生BSTR,用過立即釋放。

字符串相關類型的推薦選擇順序

優先級

類型

說明

最高

stl::string/wstring

· 功能最完善,可移植性最好。

CString

· 如果編碼規范限制使用STL的時候,推薦CString。

· VC 6的版本很不完善。.Net有明顯改進,需要進一步研究。

C/C++ basic type(TCHAR* / char* / LPTSTR / LPCTSTR / TCHAR[])

· 在結構體中,優先使用指定最大長度的字符數組。

· 效率最好

CComBSTR/ _bstr_t

· 在必須使用BSTR時的優先選擇。

· 在ATL(COM component)工程或者工程中必須使用ATL中,優先選擇CComBSTR。一般Exe/dll如果_bstr_t能滿足要求,優先使用_bstr_t。

· 對于VC6,使用_bstr_t一定要慎重,最好只用作簡單臨時變量保存調被調用函數的傳入參數。因為_bstrt_t不能支持一些關鍵性操作,比如Detach。

· 對于VC++ .Net推薦使用_bstr_t,它是C++擴展,不需要額外包含ATL的文件。

最低

BSTR

· COM接口

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的bstr java_BSTR详解一 -BSTR简介和内部结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。