当前位置:首页 > 网络编程 > 软件语言 > C++ > C++字符串完全指南(2) - 各种字符串类(一)

C++字符串完全指南(2) - 各种字符串类(一)

点击次数:41 次 发布日期:2008-12-12 16:24:34 作者:源代码网
源代码网推荐 另外还有一个字符类型OLECHAR。

源代码网整理以下

另外还有一个字符类型OLECHAR。这是一种对象链接与嵌入的数据类型(比如嵌入Word文档)。这个类型通常定义为wchar_t。如果将预处理设置定义为OLE2ANSI,OLECHAR将被定义为char类型。现在已经不再定义OLE2ANSI(它只在MFC 3以前版本中使用),所以我将OLECHAR作为Unicode字符处理。

下面是与OLECHAR相关的类型定义:

还有以下二个宏让相同的代码能够适用于MBCS和Unicode编码:

宏_T有几种形式,功能都相同。如: -- TEXT, _TEXT, __TEXT, 和 __T这四种宏的功能相同。

COM中的字符串 - BSTR 与 VARIANT

许多COM接口使用BSTR声明字符串。BSTR有一些缺陷,所以我在这里让它独立成章。

BSTR是Pascal类型字符串(字符串长度值显式地与数据存放在一起)和C类型字符串(字符串长度必须通过寻找到结尾零字符来计算)的混合型字符串。BSTR属于Unicode字符串,字符串中预置了字符串长度值,并且用一个零字符来结尾。下面是一个”Bob”的BSTR字符串:

注意,字符串长度值是一个DWORD类型值,给出字符串的字节长度,但不包括结尾零。在上例,”Bob”含有3个Unicode字符(不计结尾零),6个字节长。因为明确给出了字符串长度,所以当BSTR数据在不同的处理器和计算机之间传送时,COM库能够知道应该传送的数据量。

附带说一下,BSTR可以包含任何数据块,不单是字符。它甚至可以包容内嵌零字符数据。这些不在本文讨论范围。

C++中的BSTR变量其实就是指向字符串首字符的指针。BSTR是这样定义的:

typedef OLECHAR* BSTR;  

这个定义很糟糕,因为事实上BSTR与Unicode字符串不一样。有了这个类型定义,就越过了类型检查,可以混合使用LPOLESTR和BSTR。向一个需要LPCOLESTR (或 LPCWSTR)类型数据的函数传递BSTR数据是安全的,反之则不然。所以要清楚了解函数所需的字符串类型,并向函数传递正确类型的字符串。

要知道为什么向一个需要BSTR类型数据的函数传递LPCWSTR类型数据是不安全的,就别忘了BSTR必须在字符串开头的四个字节保留字符串长度值。但LPCWSTR字符串中没有这个值。当其它的处理过程(如Word)要寻找BSTR的长度值时就会找到一堆垃圾或堆栈中的其它数据或其它随机数据。这就导致方法失效,当长度值太大时将导致崩溃。

许多应用接口都使用BSTR,但都用到二个最重要的函数来构造和析构BSTR。就是SysAllocString()和SysFreeString()函数。SysAllocString()将Unicode字符串拷贝到BSTR,SysFreeString()释放BSTR。示例如下:

BSTR bstr = NULL;bstr = SysAllocString ( L"Hi Bob!" );if ( NULL == bstr )    // 内存溢出   // 这里使用bstrSysFreeString ( bstr );  

当然,各种BSTR包装类都会小心地管理内存。

自动接口中的另一个数据类型是VARIANT。它用于在无类型语言,诸如JScript,VBScript,以及Visual Basic,之间传递数据。VAR

源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华