MFC下的常用字符串数据类型表示的含义:
L:Long 长 P:Point 指针 C:Const 常量 W:Wchar_t 宽字符 T:TCHAR STR:String 字符串
在看看MFC下各种数据类型的定义:
typedef char *LPSTR; typedef const char *LPCSTR; typedef wchar_t *LPWSTR; typedef const wchar_t *LPCWSTR; typedef wchar_t WCHAR; #ifdef UNICODE typedef LPCWSTR LPCTSTR; typedef WCHAR TCHAR; #else typedef LPCSTR LPCTSTR; typedef char TCHAR;
MFC下提供的ATL 转换宏:
T2A T2W T2CA T2CW W2A W2CA W2T W2CT A2W A2CW A2T A2CT
T:TCHAR 2:To C:CONST A:CHAR(ANSI) W:WCHAR
先到atlconv.h头文件下看看这些宏的定义,
1.USES_CONVERSION:注意int _convert; (_convert);这种用法是为了屏蔽编译器的警告:未引用的局部变量。。。
#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
可见,USES_CONVERSION宏定义了一些转换所需要的变量,如_convert。所以使用那些宏的时候必须加上该宏。
2.A2W:这里就用到了USES_CONVERSION宏定义的_convert变量
#define A2W(lpa) ( ((_lpa = lpa) == NULL) ? NULL : ( _convert = (lstrlenA(_lpa)+1), (INT_MAX/2<_convert)? NULL : ATLA2WHELPER((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, _acp)))
3.ATLA2WHELPER
#define ATLA2WHELPER AtlA2WHelper
4.AtlA2WHelper:实际上还是在调用MultiByteToWideChar,即多字节转换为宽字节
_Ret_opt_z_cap_(nChars) inline LPWSTR WINAPI AtlA2WHelper(_Out_z_cap_(nChars) LPWSTR lpw, _In_z_ LPCSTR lpa, _In_ int nChars, _In_ UINT acp) throw() { ATLASSERT(lpa != NULL); ATLASSERT(lpw != NULL); if (lpw == NULL || lpa == NULL) return NULL; *lpw = '