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的转换宏。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值