typedef CONST WCHAR *LPCWSTR, *PCWSTR;
LPCWSTR Name=L"TestlpCwstr";
由于LPCWSTR必须指向Unicode的字符串,问题的关键变成了ANSI字符与Unicode(可以参考: VC中_T("")与L区别)字符之间的转换。通过查询资料,涉及到不同编码间的转换,可以ATL中转换宏可以用如下方法实现:
//方法一
CString str=_T("TestStr");
USES_CONVERSION;
LPWSTR pwStr=new wchar_t[str.GetLength()+1];
wcscpy(pwStr,T2W((LPCTSTR)str));
// 方法二
CString str=_T("TestStr");
USES_CONVERSION;
LPWCSTR pwcStr = A2CW((LPCSTR)str);
#include
void fn()
{
while(true)
{
{
USES_CONVERSION;
DoSomething(A2W("SomeString"));
}
}
}
它的宏定义为:
#define A2W(lpa) (\
((_lpa = lpa) == NULL) ? NULL : (\
_convert = (lstrlenA(_lpa)+1),\
ATLA2WHELPER((LPWSTR) alloca(_convert*2), _lpa, _convert)))
#define ATLA2WHELPER AtlA2WHelper
inline LPWSTR WINAPI AtlA2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars, UINT acp)
{
ATLASSERT(lpa != NULL);
ATLASSERT(lpw != NULL);
// verify that no illegal character present
// since lpw was allocated based on the size of lpa
// don't worry about the number of chars
lpw[0] = '\0';
MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
return lpw;
}
关键的地方在 alloca 内存分配内存上。
void fn2()
{
USES_CONVERSION;
DoSomething(A2W("SomeString"));
}
void fn()
{
while(true)
{
fn2();
}
}
如果不知道这点问题,在使用后崩溃时很难查出崩溃原因的。
//方法三
CString str = _T("test");
LPCWSTR lpcwStr = str.AllocSysString();
如果将LPCWSTR转换成CString,那就更加容易,在msdn中的CString类说明中提到了可以直接用LPCWSTR来构造CString,所以可以进行如下的转换代码:
LPCWSTR pcwStr = L"TestpwcStr";
CString str(pcwStr);
CString str = _T("test");
LPWSTR lpwStr = (LPWSTR)(LPCTSTR)str;
这里转化以后只是得到的是一个指针,而不是str的真实内容。
CString str = _T("test");
USES_CONVERSION;
LPWSTR lpwStr = A2W(str);
这样的转换也比较简单。。。。
wchar_t szBuffer[100] = {0};
wcscpy(szBuffer,L"test");
LPWSTR lpwStr = szBuffer;
//方法一
CString str = _T("test");
LPSTR lpStr = str.GetBuffer();
str.ReleaseBuffer();
//方法二
CString str = _T("test");
LPSTR lpStr = (LPSTR)(LPCSTR)str;
LPSTR转为CString
LPSTR lpStr = L"lpTestStr";
CString str(lpStr);
CString str = _T("test");
LPCSTR lpcStr = (LPCSTR)str;
//方法一
CString str = _T("test");
char *p = str.GetBuffer();
//方法二
CString str = _T("test");
char *p = (LPSTR)(LPCSTR)str;
char *转换成CString
char *p = "test";
CString str = ("%s",p);
或者
char *p = "test";
CString str;
str.Format(_T("%s"),p);
A2CW (LPCSTR) -> (LPCWSTR)
A2W (LPCSTR) -> (LPWSTR)
W2CA (LPCWSTR) -> (LPCSTR)
W2A (LPCWSTR) -> (LPSTR)
所有的宏如下表所示:
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 的缩写 |
利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION;
使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。
但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
1、只适合于进行短字符串的转换;
2、不要试图在一个次数比较多的循环体内进行转换;
3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();