C++字符串完全指南(2) - 各种字符串类- CRT类
C++字符串完全指南(2) - 各種字符串類- CRT類
_bstr_t
字符串包裝類
我已經(jīng)說(shuō)明了字符串的各種類型,現(xiàn)在討論包裝類。對(duì)于每個(gè)包裝類,我都會(huì)說(shuō)明它的對(duì)象構(gòu)造過(guò)程和如何轉(zhuǎn)換成C類型字符串指針。應(yīng)用接口的調(diào)用,或構(gòu)造另一個(gè)不同類型的字符串類,大多都要用到C類型指針。本文不涉及類的其它操作,如排序和比較等。
再?gòu)?qiáng)調(diào)一下,在完全了解轉(zhuǎn)換結(jié)果之前不要隨意使用強(qiáng)制類型轉(zhuǎn)換。
CRT類
_bstr_t
_bstr_t 是BSTR的完全包裝類。實(shí)際上,它隱含了BSTR。它提供多種構(gòu)造函數(shù),能夠處理隱含的C類型字符串。但它本身卻不提供BSTR的處理機(jī)制,所以不能作為COM方法的輸出參數(shù)[out]。如果要用到BSTR* 類型數(shù)據(jù),用ATL的CComBSTR類更為方便。
_bstr_t 數(shù)據(jù)可以傳遞給需要BSTR數(shù)據(jù)的函數(shù),但必須滿足以下三個(gè)條件:
首先,_bstr_t 具有能夠轉(zhuǎn)換為wchar_t*類型數(shù)據(jù)的函數(shù)。
其次,根據(jù)BSTR定義,使得wchar_t* 和BSTR對(duì)于編譯器來(lái)說(shuō)是相同的。
第三,_bstr_t內(nèi)部保留的指向內(nèi)存數(shù)據(jù)塊的指針 wchar_t* 要遵循BSTR格式。
滿足這些條件,即使沒(méi)有相應(yīng)的BSTR轉(zhuǎn)換文檔,_bstr_t 也能正常工作。示例如下:
?// 構(gòu)造
_bstr_t bs1 = "char string";??????? // 從LPCSTR構(gòu)造
_bstr_t bs2 = L"wide char string"; // 從LPCWSTR構(gòu)造
_bstr_t bs3 = bs1;????????????? // 拷貝另一個(gè) _bstr_t
_variant_t v = "Bob";
_bstr_t bs4 = v;????????????? // 從一個(gè)含有字符串的 _variant_t 構(gòu)造
// 數(shù)據(jù)萃取
LPCSTR psz1 = bs1;????????????? // 自動(dòng)轉(zhuǎn)換到MBCS字符串
LPCSTR psz2 = (LPCSTR) bs1;???? // cast OK, 同上
LPCWSTR pwsz1 = bs1;??????????? // 返回內(nèi)部的Unicode字符串
LPCWSTR pwsz2 = (LPCWSTR) bs1;? // cast OK, 同上
BSTR??? bstr = bs1.copy();????? // 拷貝bs1, 返回BSTR
// ...
? SysFreeString ( bstr );
注意,_bstr_t 也可以轉(zhuǎn)換為char* 和 wchar_t*。這是個(gè)設(shè)計(jì)問(wèn)題。雖然char* 和 wchar_t*不是常量指針,但不能用于修改字符串,因?yàn)榭赡軙?huì)打破內(nèi)部BSTR結(jié)構(gòu)。
[_variant_t]
_variant_t
_variant_t 是VARIANT的完全包裝類。它提供多種構(gòu)造函數(shù)和數(shù)據(jù)轉(zhuǎn)換函數(shù)。本文僅討論與字符串有關(guān)的操作。
// 構(gòu)造
_variant_t v1 = "char string"; // 從LPCSTR 構(gòu)造
_variant_t v2 = L"wide char string"; // 從LPCWSTR 構(gòu)造
_bstr_t bs1 = "Bob";
_variant_t v3 = bs1; // 拷貝一個(gè) _bstr_t 對(duì)象
// 數(shù)據(jù)萃取
_bstr_t bs2 = v1; // 從VARIANT中提取BSTR
_bstr_t bs3 = (_bstr_t) v1; // cast OK, 同上
注意,_variant_t 方法在轉(zhuǎn)換失敗時(shí)會(huì)拋出異常,所以要準(zhǔn)備用catch 捕捉_com_error異常。
另外要注意 _variant_t 不能直接轉(zhuǎn)換成MBCS字符串。要建立一個(gè)過(guò)渡的_bstr_t 變量,用其它提供轉(zhuǎn)換Unicode到MBCS的類函數(shù),或ATL轉(zhuǎn)換宏來(lái)轉(zhuǎn)換。
與_bstr_t 不同,_variant_t 數(shù)據(jù)可以作為參數(shù)直接傳送給COM方法。_variant_t 繼承了VARIANT類型,所以在需要使用VARIANT的地方使用_variant_t 是C++語(yǔ)言規(guī)則允許的。
在后面的章節(jié)里,我還會(huì)介紹STL、ATL等字符串類。
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的C++字符串完全指南(2) - 各种字符串类- CRT类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: xp下编程实现窗体透明特效
- 下一篇: 第04课:深度学习框架 PyTorch