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