ATL字符串转换宏

有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏,你相信吗?

头文件
d:/program files/microsoft visual studio 8/vc/atlmfc/include/atlconv.h

如果要使用ATL字符串转换宏,请先定义
USES_CONVERSION;  // 只需要调用一次,就可以在函数中进行多次转换

下面一个例子:
    USES_CONVERSION;  // 只需要调用一次,就可以在函数中进行多次转换
    char a[12] = "china";
    ::MessageBoxW( NULL, A2W(a), L"", MB_ICONASTERISK|MB_TASKMODAL|MB_OK );

使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
    1、只适合于进行短字符串的转换;
    2、不要试图在一个次数比较多的循环体内进行转换;
    3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
    4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

使用 ATL 提供的转换宏
 

A2BSTROLE2AT2AW2A
A2COLEOLE2BSTRT2BSTRW2BSTR
A2CTOLE2CAT2CAW2CA
A2CWOLE2CTT2COLEW2COLE
A2OLEOLE2CWT2CWW2CT
A2TOLE2TT2OLEW2OLE
A2WOLE2WT2WW2T

上表中的宏函数,其实非常容易记忆:
2好搞笑的缩写,to 的发音和 2 一样,所以借用来表示“转换为、转换到”的含义。
AANSI 字符串,也就是 MBCS。
W、OLE宽字符串,也就是 UNICODE。
T中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A
Cconst 的缩写

ATL3.0 的字符串转换宏

ATL3.0中常用的字符串转换宏无非是 A2W , W2A , A2T , T2A , A2OLE 等,当然在使用这些宏之前(函数开始处)必须使用USES_CONVERSION 宏。这些宏很大程度上方便了宽字符串与多字节字符串间的转换,但是在使用这些时有一些限制。其中非常重要的一点是,这些宏不宜在循环中使用。 ATL7.0 中的字符串转换 类 和 宏 则很好地避免了这些问题。

ATL7.0 中新的字符串转换 类和宏

ATL7.0 中新的字符串转换 宏 主要有 CA2W , CW2A , CW2T, CA2T ,  CA2OLE 等。这些宏都是基于CA2WEX 和CW2AEX这两个模板类,同时在进行字符串转换时还可以指定字符串转换时所使用的code page,例如:

[cpp]  view plain copy
  1. // Specifying the code page.  
  2. void ExampleFunctionW( LPCWSTR pszW )  
  3. {   
  4. // Convert to the utf-8 code page     
  5.     ExampleFunctionA( CW2A( pszW, CP_UTF8 ) );  
  6. }  


 

与之前的字符串转换宏相比,两者有如下不同

ATL 3.0 字符串转换宏ATL7.0 字符串转换类
在栈上分配内存对于短字符串使用栈上的内存,如果内存不够使用堆内存
在函数退出时字符串占用的内存被释放当变量超出作用域后内存被释放
不能在异常处理代码中使用可以在异常处理代码中使用
不适用于循环,内存会一直增长直到函数退出可以在循环中使用,每次迭代分配的内存都会被释放
不适用于太长的字符串,栈内存是有限的可以处理长字符串,在堆中分配内存
通常需要定义 USES_CONVERSION不需要定义USES_CONVERSION
OLE的含义取决于OLE2ANSI的定义

OLE 等同于W

 从上面的对比可以看出ATL7.0 中新的字符串转换 类/宏 相比于旧的字符串转换宏有很大的改进。

在使用新的字符串转换宏时需要注意下面的问题

在使用ATL 3.0 的宏时,可能会有下面的代码

[cpp]  view plain copy
  1. LPCTSTR szr = A2T( szReplaceFile );  

上面的代码是正确的,而在ATL7.0 中类似的

[cpp]  view plain copy
  1. LPCTSTR szr = CA2T( szReplaceFile );  

一般来说却是错误的,如果在后面的代码中使用 szr 时,szr所指向的内存已经被销毁,因为 CA2T的实例已经超出作用域

 

 

参考:http://msdn.microsoft.com/en-us/library/87zae4a3(v=vs.100).aspx  (ATL and MFC String Conversion Macros)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值