今天頭一回在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“,把這個前面的勾去掉,那樣就一切正常了。