`
CanBeatle
  • 浏览: 166839 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

COM中的字符串

    博客分类:
  • C++
阅读更多

1.  OLECHAR 

     COM是一个语言中立硬件结构中立的模型。因此,它需要一个语言中立、硬件结构中立的文本数据类型。由于不同的平台使用的字符类型不同,所以很难有一种类型能使和COM的需要。所以COM就定义了一种文本数据类型——OLECHAR。在大多数平台上,包括WIN32平台都把OLECHAR解释成WCHAR,而在一些16位操作系统下,如win95, Macintonsh OS, OLECHAR会被解释成CHAR。

    OLECHAR:

#if defined(_WIN32) && !defined(OLE2ANSI)
typedef WCHAR OLECHAR;

   WCHAR: 

#ifndef _MAC
typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character
#else
// some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char
typedef unsigned short WCHAR;    // wc,   16-bit UNICODE character
#endif

    在Win32种,OLECHAR就是wchar_t(16位的Unicode字符)
2.  OLECHAR* 和BSTR 

     当我们使用C/C++定义接口的方法传递字符串的时候或者从接口接受一个字符串的时候,经常会用OLECHAR*,在构建一个OLECHAR*的时候需要用宏OLESTR()把字符串包起来, 告诉编译器该常量的类型为wchar_t。 

const OLECHAR * pwsz = OLESTR("Hello");
等价于
const wchar_t * pwsz = L"Hello"

    如果我们使用其它语言定义的接口时,字符串经常是BSTR类型。

 

 

BSTR是"Basic STRing"的简称,它实际上就是OLECHAR *,

 

typedef /* [wire_marshal] */ OLECHAR *BSTR;

 

      对于windows系统(32位),可以简单理解为OLECHAR使用的就是Unicode 。OLECHAR串与单字节字符串很类似,是一个以null结尾的buffer。唯一的区别是每个字符占两个字节,而不是一个。 
 
      使用以null 结尾的简单字符串在COM component间传递不太方便。因此,标准BSTR是一个有长度前缀和null 结束符的OLECHAR数组。BSTR的前4字节是一个表示字符串长度的前缀。BSTR长度域的值是字符串的字节数,并且不包括0结束符。由于BSTR的前四个字节表示长度,而OLECHAR数组的前四字节表示前两个字符。这种情况下,对于C++程序,如何实现BSTR和OLECHAR数组的交换?答案是COM提供了两个BSTR分配用的API:SysAllocString / SysReallocString。函数返回的指针指向BSTR的第一个字符,而不是BSTR在内存的第一个字节。另外,复制BSTR意味着制作字符串的一个拷贝,不是简单的复制指针,BSTR字符数组内部可以包含嵌入的NULL字符。

      不能把BSTR当LECHAR*,OLECHAR*会以NULL为结尾,会把内嵌NULL的BSTR截断。反过来,我们不能把OLECHAR*看作BSTR,虽然他们都指向一个字符数组,但是他前边的四个字节的内容是无效的,也就是BSTR的长度无效。

 

3.  TCHAR

    TCHAR 是为了统一多语言编码而设计的。ANSI 是单字符编码,UNICODE 双字节字符编码,UTF-8  三字节字符编码,通过不同的编译选项,生成不同的支持不同编码的程序。例如:程序编译为 ANSI, TCHAR 就是相当于 CHAR,
当程序编译为 UNICODE, TCHAR 就相当于 WCHAR。

 

4.  字符串的转换

      即使我们在程序内部都进行了统一编码。但是,如果涉及到对第三方程序的应用,不可避免的要引起字符处理的混乱。我们希望能够把这些涉外的字符串和程序内部的字符串进行转换。这样可以维护程序的一致性。

ATL提供了一系列的转换宏,在必要的时候他可以在前边提到的字符类型之间进行转换。这些宏的命名使用“<源类型缩写>2<目标类型缩写>”的形式。具体缩写如下所示:

T           TCHAR类型指针——LPTSTR

W          Unicode wchar类型指针——LPWSTR

A            MBCS/ANSI char类型指针——LPSTR

OLE        COM OLECHAR类型的指针——LPOLESTR

BSTR       COM BSTR类型字符串。

C            C/C++中的const修饰符

在宏转换的时候,不可避免的要产生一些临时变量(如字符串长度),这些变量会在栈上分配。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics