用WM_COPYDATA实现进程通信中的乱码问题(高手请进,在线等待)
编写2个SDI程序
发送端主要代码:
HWND hWnd = FindWindow(NULL,"MyApp");
if(hWnd!=NULL)
{
COPYDATASTRUCT cpd; /*给COPYDATASTRUCT结构赋值*/
cpd.dwData = 0;
cpd.cbData = strlen("Hello");
cpd.lpData = (void*)"Hello";
::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//发送!
}
接收端主要代码:
接收端重载ON_WM_COPYDATA消息映射函数(用ClassWizard添加)
afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用对话框表示收到消息*/
return CWnd::OnCopyData(pWnd, pCopyDataStruct);
}
编译,连接,一切正常。但是,接受端显示的字符串是:Hello #*|**A
其中*为汉字形状的乱码,为什么呢?
问题点数:20、回复次数:7Top
1 楼hwonzor(闲人)回复于 2003-05-02 08:51:35 得分 0
缺少字符串结束符
OnCopyData
{
char * buff = new char[pCopyDataStruct->cbData + 1];
memcpy(buff, pCopyDataStruct->lpData , pCopyDataStruct->cbData);
buff[pCopyDataStruct->cbData] = 0;
AfxMessageBox(buff);
delete [] buff
}Top
2 楼jjggww2000(jjggww2000)回复于 2003-05-02 13:17:53 得分 0
感谢hwonzor大哥!
另外,我再想补充问一下,
1. 用WM_COPYDATA实现进程通信原理是不是这样:发送端在内存中开辟一块空间(COPYDATASTRUCT cpd),并写入一个字符串(cpd.lpData = (void*)"Hello";),用发消息(::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);)传送该内存块的地址(cpd.lpData )给接受端;接受端根据此地址读取相应多个(cpd.cbData = strlen("Hello"))字符?
2.根据MSDN,AfxMessageBox定义如下:
int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );
其中lpszText
Points to a CString object or null-terminated string containing the message to be displayed in the message box.
null-terminated string 是什么意思?是指以0结尾的字符串么?
3.字符串结束符不是'/0'么?为什么这里只能用'0'?
恳请高手百忙之中予以解答!
Top
3 楼rtdb(东临碣石)回复于 2003-05-02 13:53:41 得分 10
唉。字符串基本概念。
'\0'和'0'是一个意思。 都是字符串结束符。
你在发送时用strlen计算长度, 就没有包括结束符,
因此在接收方要补上一个。
你在发送时,
cpd.cbData = strlen("Hello") + 1;
发送长度加个1, 就把结束符也发出来了,
那么在接收方就不用补了。
Top
4 楼hwonzor(闲人)回复于 2003-05-02 16:11:04 得分 10
1.同意
2.对
3.rtdb(东临碣石) 说了,他的方法更简单。Top
5 楼jjggww2000(jjggww2000)回复于 2003-05-02 19:06:12 得分 0
感谢hwonzor(闲人) 和rtdb(东临碣石) 两位朋友,结贴给分,请查收。Top
6 楼hwonzor(闲人)回复于 2003-05-02 20:53:48 得分 0
收到,呵呵Top




