只有在你不得不用的時(shí)候。
?
使用
BSTR
一般有以下幾種情況:
-
COM interface
接口定義,并且不希望額外提供
custom marshaling
庫(kù)(
MDIL
生成或開發(fā)人員自己訂制),必須使用
BSTR
傳遞字符串。使用
C/C++
類型的字符串在
COM DLL
傳遞字符串,表面上可以使用,但違背了
COM
的基本規(guī)則,并且給以后的擴(kuò)展留下了
隱患。例如,把一個(gè)
In-process COM Object(
簡(jiǎn)單說
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ù)制和釋放帶來麻煩。最好直接使用限定最大長(zhǎng)度的
TCHAR
數(shù)組。如果確實(shí)需要傳遞變長(zhǎng)字符串,
BSTR
應(yīng)該被定義成獨(dú)立的參數(shù)或者使用獨(dú)立的
get/set
接口。
-
盡可能縮小的
BSTR
及相關(guān)類型的作用域范圍。
類的成員變量和函數(shù)參數(shù)不使用
BSTR
。局部變量要盡快釋放類的內(nèi)部不使用
BSTR
。代碼處理邏輯中只在接口直接相關(guān)部分使用
BSTR
。接收到一個(gè)
BSTR
時(shí),盡量立刻變成
C/C++
的字符串副本進(jìn)行處理。在需要傳遞
BSTR
參數(shù)前產(chǎn)生
BSTR
,用過立即釋放。
?
字符串相關(guān)類型的推薦選擇順序
|
優(yōu)先級(jí)
|
類型
|
說明
|
|
最高
|
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)?/span>
_bstrt_t
不能支持一些關(guān)鍵性操作,比如
Detach
。
·????????
對(duì)于
VC++ .Net
推薦使用
_bstr_t
,它是
C++
擴(kuò)展,不需要額外包含
ATL
的文件。
|
|
最低
|
BSTR
|
·????????
COM
接口
|
?
posted on 2007-01-26 16:13
我風(fēng) 閱讀(485)
評(píng)論(0) 編輯 收藏 引用