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转换宏。
注意在上个例子中使用了Detach()方法。调用这个方法后,CComBSTR对象不再管理它的BSTR字符串或者说它对应的内存。这就是bstr4需要调用SysFreeString()的原因。
做一个补充说明:重载的&操作符意味着在一些STL容器中你不能直接使用CComBSTR变量,比如list.容器要求&操作符返回一
个指向容器包含的类的指针,但是对CComBSTR变量使用&操作符返回的是BSTR*,而不是CComBSTR*.然而,有一个ATL类可以解
决这个问题,这个类是CAdapt.例如,你可以这样声明一个CComBSTR的list:
CAdapt提供容器所需要的操作符,但这些操作符对你的代码是透明的。你可以把一个bstr_list当作一个CComBSTR的list来使用。
CComVariant
CComVariant是VARIANT的封装类。然而,不像_variant_t,在CComVariant中VARIANT没有被隐藏。事实上你需
要直接访问VARIANT的成员。CComVariant提供了很多构造函数来对VARIANT能够包含的多种类型进行处理。这里,我将只介绍和字符串相
关的操作。
不像_variant_t,这里没有提供针对VARIANT包含的各种类型的转换操作符。正如上面介绍的,你必须直接访问
VARIANT的成员并且确保这个VARIANT变量保存着你期望的类型。如果你需要把一个CComVariant类型的数据转换成一个BSTR类型的数
据,你可以调用ChangeType()方法。
像_variant_t一样,CComVariant也没有提供向MBCS字符串转换的转换操作。你需要创建一个_bstr_t类型的中间变量,使用提供从Unicode到MBCS转换的另一个字符串类,或者使用一个ATL的转换宏。
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 ); |
做一个补充说明:重载的&操作符意味着在一些STL容器中你不能直接使用CComBSTR变量,比如list.容器要求&操作符返回一
个指向容器包含的类的指针,但是对CComBSTR变量使用&操作符返回的是BSTR*,而不是CComBSTR*.然而,有一个ATL类可以解
决这个问题,这个类是CAdapt.例如,你可以这样声明一个CComBSTR的list:
std::list< CAdapt<CComBSTR> > bstr_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的成员并且确保这个VARIANT变量保存着你期望的类型。如果你需要把一个CComVariant类型的数据转换成一个BSTR类型的数
据,你可以调用ChangeType()方法。
CComVariant v4 = ... // Init v4 from somewhere CComBSTR bs3; if ( SUCCEEDED( v4.ChangeType ( VT_BSTR ) )) bs3 = v4.bstrVal; |
相关文章推荐
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- (转载)C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 —— 字符串封装类
- C++字符串完全指引之二 - 字符串封装类
- C++字符串完全指引之二 --WIN32字符编码