ATL提供了宏来进行unicode和MBCS字符串之间的转换,
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 |
使用这些宏的时候还要注意宏 USES_CONVERSION; 的使用,
在调用宏进行转换的函数开头,要加上一句代码
USES_CONVERSION;
不然会有编译错误产生,错误信息如下:
: error C2065: '_lpw' : undeclared identifier
: error C2065: '_convert' : undeclared identifier
: error C2065: '_acp' : undeclared identifier
: error C3861: '_lpw': identifier not found, even with argument-dependent lookup
: error C3861: '_convert': identifier not found, even with argument-dependent lookup
: error C3861: '_lpw': identifier not found, even with argument-dependent lookup
: error C3861: '_convert': identifier not found, even with argument-dependent lookup
为什么会产生这些错误呢?看一下这个宏的定义就了解了:P
#ifndef _DEBUG
#define USES_CONVERSION int _convert; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw; (_lpw); LPCSTR _lpa; (_lpa)
#else
#define USES_CONVERSION int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa)
#endif
这个宏定义了几个要在转换宏中使用的参数,因此没有它,编译错误就产生了。
由于 ATL 转换宏使用栈作为临时空间,这句定义必须加在函数体内。
本文详细介绍了ATL中用于Unicode和MBCS字符串转换的宏,并解释了如何正确使用宏USES_CONVERSION来避免编译错误。对于进行跨字符集编程的开发者来说,这些宏非常实用。

1022

被折叠的 条评论
为什么被折叠?



