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的轉換宏。