新手用VS2010编写一个MFC工具所遇到的问题。
在之前做MFC用的都是用VC6,没有遇到太多问题,鉴于不太喜欢思考原因,所以一直糊里糊涂的用,现在想想,vc6新建MFC工程时应该默认的是非unicode编码吧。而VS2010编写一个MFC默认的是unicode的编码。
unicode编码时CString默认的是双字节的类型,也就是CString是与wchar_t* 相互转化,当我们传入char[ ]或char*时可能自动转换成双字节类型,也可能需要我们手动来转换,否则会报错,此时_T()也是有很大作用的(关于_T()在下文介绍)。当我们要将CString字符写入文件时,也要注意将其转换成char类型,以便可以直观的查阅,当然也可以不转,看起来就比较费事了,读取的时候也要记得是unicode的编码类型。
非unicode编码时,CString是与char*可较为直接的相互转化,一般常用有2种方式:
1. CString strFileName;
LPSTRlpStr = strFileName.GetBuffer();
strFileName.ReleaseBuffer();
2.CString strFileName;
LPSTRlpStr = (LPSTR)(LPCSTR)strFileName;
百度了CString,里面对_T()有这样的解释:
int SMGCmdFactory::MultiByteToWChar(const char* pBuf, CString& csBuf)
{
csBuf = _T("");
DWORD dwMinSize;
int nMsgBodyLen = strlen(pBuf) + 1; // 以\0结尾,strlen没有加此一个字节的长度?若不加1,字符串最后会有乱码
dwMinSize = MultiByteToWideChar (CP_ACP, 0, pBuf, -1, NULL, 0);
if(nMsgBodyLen < dwMinSize)
{
return -1;
}
wchar_t* pwBuf = csBuf.GetBuffer(dwMinSize);
dwMinSize = MultiByteToWideChar (CP_ACP, 0, pBuf, nMsgBodyLen, pwBuf, dwMinSize);
if (dwMinSize == 0)
{
return -1;
}
csBuf.ReleaseBuffer();
return dwMinSize;
}
int SMGCmdFactory::WCharToMultiByte(CString& csBuf, char** pBuf)
{
DWORD dwMinSize;
int len = csBuf.GetLength();
dwMinSize = WideCharToMultiByte(CP_ACP,0,(LPCTSTR)csBuf,csBuf.GetLength(),NULL,0,NULL,FALSE);
*pBuf = new char[dwMinSize + 1]; // 若不加1,字符串最后会有乱码
memset(*pBuf, 0, dwMinSize + 1);
dwMinSize = WideCharToMultiByte(CP_ACP,0,(LPCTSTR)csBuf,len,*pBuf,dwMinSize,NULL,FALSE);
if (dwMinSize == 0)
{
return -1;
}
return 0;
}
释放上面函数开辟的空间函数
void SMGCmdFactory::CmdFactoryFree(void *pMsgBody)
{
delete []pMsgBody;
return;
}
char* pReq = null;
CString csReq = _T("aaaaaaa");
int nRet = WCharToMultiByte(csReq, &pReq);
if (nRet != 0)
{
MessageBox(_T("转换请求失败!"));
return;
}
CmdFactoryFree(pReq);
在VS2010中,MFC的CString在Unicode编码环境下与char*交互时需要注意转换。Unicode的CString对应wchar_t*,可能需要手动转换避免错误。使用_T()宏在字符串处理中有重要作用,涉及文件读写时,需留意字符类型转换。
1230

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



