您的位置:首页 > 编程语言 > C语言/C++

C++字符串完全指引之二 —— 字符串封装类

2009-02-27 16:02 495 查看
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的转换宏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: