Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230516
  • 博文数量: 55
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-22 17:59
文章分类

全部博文(55)

文章存档

2015年(2)

2011年(1)

2010年(1)

2009年(18)

2008年(16)

2007年(17)

我的朋友

分类: C/C++

2009-11-29 16:38:48

    VC中关于字符串的类型有好多种,如果对这些类型不彻底了解在使用中就会出现各种各样的错误,前些天开发了一些COM组件,在开发过程中经常会用到一些字符串类型之间的转换,由于以前对这些类型没有认真研究过在使用过程中出现了一些问题,现在,把它们总结出来以免以后再犯错。首先,介绍一下各种字符串类型
一、各种字符串类型介绍
1、TCHAR类型
    char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。Windows为了消除各 编译器的差别,重新定义了一些数据类型,你提到了另外几个类型都是这样。
   CHAR为单字节字符。还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。

2、BSTR类型
    BSTR类型是COM中使用的标准字符串类型。它其实是一个32位指针,保存字符串首字符的地址。既然是指针类型,好的习惯应该是在定义一个BSTR类型变量时立刻初始化为NULL,即使随后立刻就会对其进行赋值。
3、CComBSTR类型
    CComBSTR 是ATL对BSTR的封装,它的操作比较方便。例如:

CComBSTR bstr1;
bstr1 = "Bye"; // 直接赋值
OLECHAR* str = OLESTR("ta ta"); // 长度为5的宽字符
CComBSTR bstr2(wcslen(str)); // 定义长度为5
wcscpy(bstr2.m_str, str); // 将宽字符串复制到BSTR中
CComBSTR bstr3(5, OLESTR("Hello World"));
CComBSTR bstr4(5, "Hello World");
CComBSTR bstr5(OLESTR("Hey there"));
CComBSTR bstr6("Hey there");
CComBSTR bstr7(bstr6);
// 构造时复制,内容为"Hey there"

对CComBSTR更多了解可以参考下面链接:http://www.cppblog.com/kyelin/articles/18015.html

5、_bstr_t类型

    _bstr_t在VC中是为了兼容BSTR类型而增加的,也就是为了实现LPCSTR与BSTR转换。

它需要头文件#include

_bstr_t 是BSTR的包装类
转换方法

  LPSTR   strDemo="Test";  
  _bstr_t   bstr(strDemo);  
  建议加上try,catch,用于catch(_com_error &e) 

6、LPSTR类型
    LPSTR和LPCSTR 类型其实是一样的。都被定义为 CHAR*. 也就是单字节字符串指针。其结尾处有一个'/0'表示字符结束。也就是C风格的字符串.
二、各种类型之间的转换
1、CComBSTR 转换为 BSTR
    CComBSTR wstr;
    BSTR val = wstr.m_str;
2、CComBSTR 转换为LPCTSTR
    USES_CONVERSION;  
  LPCTSTR psz = W2A(wstr);
3、CComBSTR 转换为char*
 (const char* )_bstr_t(wstr.m_str)
4、string 转换为 BSTR
    string str;
   _bstr_t(str.c_str);
5、其他类型转换
     
 


阅读(1054) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~