WEB开发网
开发学院软件开发C++ C++字符串完全指引之二:字符串封装类 阅读

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

 2010-10-15 09:08:04 来源:Web开发网   
核心提示:CRT提供的类_bstr_t_bstr_t是一个对BSTR的完整封装类,实际上它隐藏了底层的BSTR,C++字符串完全指引之二:字符串封装类(3),它提供各种构造函数和操作符来访问底层的C语言风格的字符串,然而,一个_variant_t变量可以被直接作为参数传递给一个COM方法,_variant_t继承自VARIANT

CRT提供的类

_bstr_t

_bstr_t是一个对BSTR的完整封装类,实际上它隐藏了底层的BSTR。它提供各种构造函数和操作符来访问底层的C语言风格的字符串。然而,_bstr_t却没有访问BSTR本身的操作符,所以一个_bstr_t类型的字符串不能被作为输出参数传给一个COM方法。如果你需要一个BSTR*参数,使用ATL类CComBSTR是比较容易的方式。

一个_bstr_t字符串能够传给一个接收参数类型为BSTR的函数,只是因为下列3个条件同时满足。首先,_bstr_t有一个向wchar_t*转换的转换函数;其次,对编译器而言,因为BSTR的定义,wchar_t*和BSTR有同样的含义;第三,_bstr_t内部含有的wchar_t*指向一片按BSTR的形式存储数据的内存。所以,即使没有文档说明,_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++语言所允许的。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:字符串 完全 指引

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接