只有在你不得不用的時候。
?
使用
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
接口
|
?
posted on 2007-01-26 16:13
我風 閱讀(471)
評論(0) 編輯 收藏 引用