纵所周知,WindowsCE下编程99%的问题都和Unicode有关.比如文件编辑,一般都保存为Ansi格式;无线通讯中控制Modem需要发送的AT指令,必须是Ansi格式;网络通讯中,PC端一般都是Ansi的,为了和PC上协议兼容,在WindowsCE中必须把要发送的一个指令从Unicode转换成Ansi格式...等等.很多初学者对于这些问题总是感到很麻烦.其实WindowsCE中有标准的API实现了Unicode和Ansi字符间的互转.下面就是网络通讯中的程序片断.
m_psocket是指向一个从CCeSocket派生的类,如果没有连接的话其为NULL;m_snd是要发送的CString,和一个EDIT相对应.
//发送函数片断void CClient1Dlg::OnButtonSend() { // TODO: Add your control notification handler code here if (!m_psocket) //无Socket连接,退出 { MessageBox(TEXT("无连接!"),TEXT("信息")); return; } UpdateData(TRUE); //保存输入的字符串到m_snd unsigned char buf[129]; //发送缓冲区 ZeroMemory(buf,sizeof(buf)); //缓冲区清零 CString tmpstr(m_snd); //复制要发送的字符串 int multibytelen=WideCharToMultiByte( //计算从Unicode转换到Ansi后需要的字节数 CP_ACP, //根据ANSI code page转换 WC_COMPOSITECHECK | WC_DEFAULTCHAR, //转换出错用缺省字符代替 tmpstr.GetBuffer(m_snd.GetLength()), //要转换的字符串地址 m_snd.GetLength(), //要转换的个数 0, //转换后字符串放置的地址 0, //最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节 0, //缺省的字符:"/0" 0 //缺省的设置 ); WideCharToMultiByte( //转换Unicode到Ansi CP_ACP, WC_COMPOSITECHECK | WC_DEFAULTCHAR, tmpstr.GetBuffer(m_snd.GetLength()), m_snd.GetLength(), (char *)buf, //转换到缓冲区中 128, //最多128个字节 0, 0 ); int sendcount=m_psocket->Send(buf,multibytelen+1); //发送转换后的缓冲区 CString statusstr; statusstr.Format(TEXT("共发送字节数:%d"),sendcount); m_status.SetWindowText(statusstr); //更新显示栏}
程序接收到的字符串最后保存到CString tmpstr中.
//接收函数片断void MyCeSocket::OnReceive(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class unsigned char p[129]; //接受缓冲区 ZeroMemory(p,sizeof(p)); //接收缓冲区清零 this->Receive(p,128); //接收128个字节 int widecharlen=MultiByteToWideChar( //计算从Ansi转换到Unicode后需要的字节数 CP_ACP, MB_COMPOSITE, (char*)p, //要转换的Ansi字符串 -1, //自动计算长度 0, 0 ); CString tmpstr; tmpstr.GetBuffer(widecharlen); //为转换后保存Unicode字符串分配内存 MultiByteToWideChar( //从Ansi转换到Unicode字符 CP_ACP, MB_COMPOSITE, (char*)p, -1, tmpstr.GetBuffer(widecharlen), //转换到tmpstr widecharlen //最多转换widecharlen个Unicode字符 );
m_clientdlg->m_listbox.InsertString(0,tmpstr); //插入到listbox中显示 CCeSocket::OnReceive(nErrorCode);}
注意:以上代码都是在WindowsCE样板机上运行,PC端发送和接收到的字符均为Ansi格式的.把以上代码稍微修改一下用到自己的产品中,就可以利用以前的协议无缝连接PDA和PC.以上代码在MicroSoft Embed Visual C++ 3.0 + 联想天玑5100(WindowsCE3.0) + Eagle Tec 10M CF卡通过.2003.Feb.18th,5:25PM,Roving in ShenZhen...