快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
即使没有文档说明,_bstr_t可以转换成BSTR,这种转换仍然可以正常进行。

// Constructing
_bstr_t bs1 = "char string";    // construct from a LPCSTR
_bstr_t bs2 = L"wide char string"; // construct from a LPCWSTR
_bstr_t bs3 = bs1;         // copy from another _bstr_t
_variant_t v = "Bob";
_bstr_t bs4 = v;          // construct from a _variant_t that has a string
// Extracting data
LPCSTR psz1 = bs1;       // automatically converts to MBCS string
LPCSTR psz2 = (LPCSTR) bs1;   // cast OK, same as previous line
LPCWSTR pwsz1 = bs1;      // returns the internal Unicode string
LPCWSTR pwsz2 = (LPCWSTR) bs1; // cast OK, same as previous line
BSTR  bstr = bs1.copy();   // copies bs1, returns it as a BSTR
 // ...
SysFreeString ( bstr );

注意_bstr_t也提供char*和wchar_t*之间的转换操作符。这是一个值得怀疑的设计,因为即使它们是非常量字符串指针,你也一定不能使用这些指针去修改它们指向的缓冲区的内容,因为那将破坏内部的BSTR结构。

_variant_t

_variant_t是一个对VARIANT的完整封装,它提供很多构造函数和转换函数来操作一个VARIANT可能包含的大量的数据类型。这里,我将只介绍与字符串有关的操作。

// Constructing
_variant_t v1 = "char string";    // construct from a LPCSTR
_variant_t v2 = L"wide char string"; // construct from a LPCWSTR
_bstr_t bs1 = "Bob";
_variant_t v3 = bs1;         // copy from a _bstr_t object
// Extracting data
_bstr_t bs2 = v1;      // extract BSTR from the VARIANT
_bstr_t bs3 = (_bstr_t) v1; // cast OK, same as previous line

注意:

如果类型转换不能被执行,_variant_t方法能够抛出异常,所以应该准备捕获_com_error异常。

还需要注意的是:

没有从一个_variant_t变量到一个MBCS字符串的直接转换。你需要创建一个临时的_bstr_t变量,使用提供Unicode到MBCS转换的另一个字符串类或者使用一个ATL转换宏。

不像_bstr_t,一个_variant_t变量可以被直接作为参数传递给一个COM方法。_variant_t

继承自VARIANT类型,所以传递一个_variant_t来代替VARIANT变量是C++语言所允许的。

STL 类

STL只有一个字符串类,basic_string。一个basic_string管理一个以0做结束符的字符串数组。字符的类型是basic_string模般的参数。总的来说,一个basic_string类型的变量应该被当作不透明的对象。你可以得到一个指向内部缓冲区的只读指针,但是任何写操作必须使用basic_string的操作符和方法。

basic_string有两个预定义的类型:包含char的string类型和包含wchar_t的wstring类型。这里没有内置的包含TCHAR的类型,但是你可以使用下面列出的代码来实现。

// Specializations
typedef basic_string tstring; // string of TCHARs
// Constructing
string str = "char string";     // construct from a LPCSTR
wstring wstr = L"wide char string"; // construct from a LPCWSTR
tstring tstr = _T("TCHAR string"); // construct from a LPCTSTR
// Extracting data
LPCSTR psz = str.c_str();  // read-only pointer to str''''s buffer
LPCWSTR pwsz = wstr.c_str(); // read-only pointer to wstr''''s buffer
LPCTSTR ptsz = tstr.c_str(); // read-only pointer to tstr''''s buffer

不像_bstr_t,一个basic_string变量不能在字符集之间直接转换。然而,你可

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号