C++字符串完全指引之二 —— 字符串封裝類

http://c.chinaitlab.com/cc/basic/200809/762624_5.html

 CComBSTR bs1;
CComBSTR bs2 = "new text";
 pStuff->GetText ( &bs1 );    // ok, takes address of internal BSTR
 pStuff->SetText ( bs2 );    // ok, calls BSTR converter
 pStuff->SetText ( (BSTR) bs2 ); // cast ok, same as previous line 


  CComBSTR有和_bstr_t相似的構造函數,然而卻沒有內置的向MBCS字符串轉換的函數。因此,你需要使用一個ATL轉換宏。

 

 // Constructing
CComBSTR bs1 = "char string";    // construct from a LPCSTR
CComBSTR bs2 = L"wide char string"; // construct from a LPCWSTR
CComBSTR bs3 = bs1;         // copy from another CComBSTR
CComBSTR bs4;
 bs4.LoadString ( IDS_SOME_STR ); // load string from string table
// Extracting data
BSTR bstr1 = bs1;    // returns internal BSTR, but don''t modify it!
BSTR bstr2 = (BSTR) bs1; // cast ok, same as previous line
BSTR bstr3 = bs1.Copy(); // copies bs1, returns it as a BSTR
BSTR bstr4;
 bstr4 = bs1.Detach(); // bs1 no longer manages its BSTR
 // ...
 SysFreeString ( bstr3 );
 SysFreeString ( bstr4 );  


  注意在上個例子中使用了Detach()方法。調用這個方法後,CComBSTR對象不再管理它的BSTR字符串或者說它對應的內存。這就是bstr4需要調用SysFreeString()的原因。
 
   做一個補充說明:重載的&操作符意味着在一些STL容器中你不能直接使用CComBSTR變量,比如list.容器要求&操作符返回一 個指向容器包含的類的指針,但是對CComBSTR變量使用&操作符返回的是BSTR*,而不是CComBSTR*.然而,有一個ATL類可以解 決這個問題,這個類是CAdapt.例如,你可以這樣聲明一個CComBSTR的list:

 

 std::list< CAdapt<CComBSTR> > bstr_list;


  CAdapt提供容器所需要的操作符,但這些操作符對你的代碼是透明的。你可以把一個bstr_list當作一個CComBSTR的list來使用。
 
  CComVariant
 
   CComVariant是VARIANT的封裝類。然而,不像_variant_t,在CComVariant中VARIANT沒有被隱藏。事實上你需 要直接訪問VARIANT的成員。CComVariant提供了很多構造函數來對VARIANT能夠包含的多種類型進行處理。這裏,我將只介紹和字符串相 關的操作。

 

 // Constructing
CComVariant v1 = "char string";    // construct from a LPCSTR
CComVariant v2 = L"wide char string"; // construct from a LPCWSTR
CComBSTR bs1 = "BSTR bob";
CComVariant v3 = (BSTR) bs1;     // copy from a BSTR
// Extracting data
CComBSTR bs2 = v1.bstrVal;      // extract BSTR from the VARIANT


  不像_variant_t,這裏沒有提供針對VARIANT包含的各種類型的轉換操作符。正如上面介紹的,你必須直接訪問 VARIANT的成員並且確保這個VARIANT變量保存着你期望的類型。如果你需要把一個CComVariant類型的數據轉換成一個BSTR類型的數 據,你可以調用ChangeType()方法。

 

 CComVariant v4 = ... // Init v4 from somewhere
CComBSTR bs3;
 if ( SUCCEEDED( v4.ChangeType ( VT_BSTR ) ))
  bs3 = v4.bstrVal;  


  像_variant_t一樣,CComVariant也沒有提供向MBCS字符串轉換的轉換操作。你需要創建一個_bstr_t類型的中間變量,使用提供從Unicode到MBCS轉換的另一個字符串類,或者使用一個ATL的轉換宏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章