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 提供的转换宏
 

A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T

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

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)


上一篇: 滚动条 实现的细节代码 SCROLLINFO

你可能感兴趣的:(c/c++)