今天头一回在vs2005上写UDP通讯程序,没想到遇到这么多麻烦。那么多类型转换出错:
LPCSTR,wchar,这之类的,把我搞糊涂了,以前没接触过这种东西,不了解这些该怎么转换。
VC6里面都可以直接换,2005里却搞那么麻烦,真是苦了我这样的新手.
作个记号
1.首先是CString转成char*的问题:
在VC6里面都是
CString str;
char *buf=new char[str.GetLength()+1];
buf=str.GetBuffer(len);
这个在vs2005里就不行,会提示不能将wchar*转换成char*的。GetBuffer()得到的是wchar*类型.
试了网上的好多方法,错误是可以消除,但是好像有信息丢失,输入的字符和输出的字符不一样。
经过百般折腾我用下面的方法可以达到我的要求:
buf=new char[1024];
int len=str.GetLength();
wcstombs(wsabuf.buf,str.GetBuffer(0),len+1); //这个是将wchar_t*换成char*的函数,有对称的另外的函数mbstowcs
2.CString的Format问题
当我写出下面这样的语句:
CString str;
str.Format("用户%s发来信息:%s",inet_ntoa(m_addrClient.sin_addr),wsabuf.buf);
时,在VC6里面是完全没错误的。
但是在2005里会报错,不能将参数1从const char【16】转成wchar_t*,因为这里参数都是要wchar_t*的,虽然可以加_T()或者L等方法消除错误,但是一样结果不对(还没搞清楚原因)
于是我换种方法来搞定它:
char recvbuf[1024];
sprintf(recvbuf,"用户%s发来信息:%s",inet_ntoa(m_addrClient.sin_addr),wsabuf.buf);
CString str(recvbuf);
这样也就达到我要求了。虽然麻烦点,但最后总算完成了。
最后才是最重要的来了,如果你对vs2005的这点很不满,你想跟以前在VC6上一样那么方便,那么请记好了:
刚开始建工程的时候有个选项是“使用Unicode“,把这个前面的勾去掉,那样就一切正常了。