2007-11-21 | BSTR詳解一 -BSTR簡介和內部結構 (1)
- C++ 字符串是以0結束的ASCII或Unicode字符數組
- Visual Basic字符串是一個ASCII字符數組加上表示長度的前綴。
- Java字符串是以0結束的Unicode字符數組。
- 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接口
|