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,例如:
// Specifying the code page.
void ExampleFunctionW( LPCWSTR pszW )
{
// Convert to the utf-8 code page
ExampleFunctionA( CW2A( pszW, CP_UTF8 ) );
}
与之前的字符串转换宏相比,两者有如下不同
ATL 3.0 字符串转换宏 | ATL7.0 字符串转换类 |
---|---|
在栈上分配内存 | 对于短字符串使用栈上的内存,如果内存不够使用堆内存 |
在函数退出时字符串占用的内存被释放 | 当变量超出作用域后内存被释放 |
不能在异常处理代码中使用 | 可以在异常处理代码中使用 |
不适用于循环,内存会一直增长直到函数退出 | 可以在循环中使用,每次迭代分配的内存都会被释放 |
不适用于太长的字符串,栈内存是有限的 | 可以处理长字符串,在堆中分配内存 |
通常需要定义 USES_CONVERSION | 不需要定义USES_CONVERSION |
OLE的含义取决于OLE2ANSI的定义 | OLE 等同于W |
从上面的对比可以看出ATL7.0 中新的字符串转换 类/宏 相比于旧的字符串转换宏有很大的改进。
在使用新的字符串转换宏时需要注意下面的问题
在使用ATL 3.0 的宏时,可能会有下面的代码
LPCTSTR szr = A2T( szReplaceFile );
上面的代码是正确的,而在ATL7.0 中类似的
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)