ATL宏介绍:
A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A:ANSI 字符串,也就是 MBCS。
W:OLE宽字符串,也就是 UNICODE。
T:中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A。
C:const 的缩写。
利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION。
使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M)。
如下是常用的几种转换实例:
// CstringConver.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "CstringConver.h"
#include "afxconv.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
//CString转换成char*
CString csName;
char *cpName;
char *cpName1;
csName = "XiaoMing";
cpName = (LPSTR)(LPCSTR)csName;
cpName1 = csName.GetBuffer(0);
csName.ReleaseBuffer();
cout << "CString转换成char*" << endl;
cout << "csName = " << (LPCTSTR)csName << "; &csName = " << &csName << endl;
cout << "*cpName = " << *cpName << "; cpName = " << cpName << endl;
cout << "*cpName1 = " << *cpName1 << "; cpName1 = " << cpName1 << endl;
cout << "****************************************************" << endl;
//CString转换成char[]
char carrHi[64];
CString csHi;
csHi = "Hi,XiaoMing.";
memset(carrHi,0,64);
memcpy(carrHi,csHi,csHi.GetLength());
cout << "CString转换成char[]" << endl;
cout << "carrHi = " << carrHi << "; &carrHi = " << &carrHi << endl;
cout << "****************************************************" << endl;
//CString转换成LPCTSTR,可以直接转换。
LPCTSTR lpcStrHi;
lpcStrHi = LPCTSTR(csHi);
cout << "CString转换成LPCTSTR,可以直接转换。" << endl;
cout << "lpcStrHi = " << lpcStrHi <<"; &lpcStrHi = " << &lpcStrHi << endl;
cout << "****************************************************" << endl;
//CString转换成LPSTR
LPSTR lpstrHi;
LPSTR lpstrHi1;
lpstrHi = (LPSTR)(LPCSTR)csHi;
lpstrHi1 = csHi.GetBuffer(0);
csHi.ReleaseBuffer();
cout << "CString转换成LPSTR" << endl;
cout << "lpstrHi = " << lpstrHi << "; &lpstrHi = " << &lpstrHi << endl;
cout << "lpstrHi1 = " << lpstrHi1 << "; &lpstrHi1 = " << &lpstrHi1 << endl;
cout << "****************************************************" << endl;
//CString转换成LPWSTR
LPWSTR lpwstrHi;
lpwstrHi = csHi.AllocSysString();
cout << "CString转换成LPWSTR" << endl;
wcout << "lpwstrHi = " << lpwstrHi <<"; &lpwstrHi = " << &lpwstrHi << endl;
cout << "****************************************************" << endl;
//CString转换成LPCWSTR
LPCWSTR lpcwstrHi;
LPCWSTR lpcwstrHi1;
lpcwstrHi = csHi.AllocSysString();
USES_CONVERSION;
lpcwstrHi1 = A2CW((LPCSTR)csHi);
cout << "CString转换成LPCWSTR" << endl;
wcout << "lpcwstrHi = " << lpcwstrHi <<"; &lpcwstrHi = " << &lpcwstrHi << endl;
wcout << "lpcwstrHi1 = " << lpcwstrHi1 <<"; &lpcwstrHi1 = " << &lpcwstrHi1 << endl;
cout << "====================================================" << endl;
cout << "****************************************************" << endl;
cout << "====================================================" << endl;
//char*转换成CString
char *cpHll = "Hello";
//使用CString构造函数。CString可以传入LPCSTR、LPCWSTR、char*、unsigned char*、const unsigned char*等参数来构造CSting对象。
CString csHll(cpHll);
CString csHll1;
csHll1.Format("%s",cpHll);
cout << "char*转换成CString" << endl;
cout << "csHll = " << (LPCTSTR)csHll << "; &csHll = " << &csHll << endl;
cout << "csHll1 = " << (LPCTSTR)csHll1 << "; &csHll1 = " << &csHll1 << endl;
cout << "****************************************************" << endl;
//char[]转换成CString
char carrHello[64] = {"Hello,XiaoMing."};
CString csHello;
csHello.Format("%s",carrHello);
cout << "char[]转换成CString" << endl;
cout << "csHello = " << (LPCTSTR)csHello << "; &csHello = " << &csHello << endl;
cout << "****************************************************" << endl;
//LPCTSTR转换成CString
LPCTSTR lpcstrWorld = _T("World");
CString csWorld(lpcstrWorld);
CString csWorld1;
csWorld1.Format("%s",lpcstrWorld);
cout << "LPCTSTR转换成CString" << endl;
cout << "csWorld = " << (LPCTSTR)csWorld << "; &csWorld = " << &csWorld << endl;
cout << "csWorld1 = " << (LPCTSTR)csWorld1 << "; &csWorld1 = " << &csWorld1 << endl;
cout << "****************************************************" << endl;
//LPSTR转换成CString
LPSTR lpstrWellcome = _T("Wellcome");
CString csWellcome(lpstrWellcome);
CString csWellcome1;
csWellcome1.Format("%s",lpstrWellcome);
cout << "LPSTR转换成CString" << endl;
cout << "csWellcome = " << (LPCTSTR)csWellcome << "; &csWellcome = " << &csWellcome << endl;
cout << "csWellcome1 = " << (LPCTSTR)csWellcome1 << "; &csWellcome1 = " << &csWellcome1 << endl;
cout << "****************************************************" << endl;
}
return nRetCode;
}