CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

用WM_COPYDATA实现进程通信中的乱码问题(高手请进,在线等待)

楼主jjggww2000(jjggww2000)2003-05-01 14:27:06 在 VC/MFC / 进程/线程/DLL 提问

编写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

相关问题

  • 如何用WM_COPYDATA在进程间交换数据
  • 如何使用WM_COPYDATA消息在两个进程间传递数据?
  • 请问用wm_copydata消息如何在进程间传递数据?
  • 在C#中如何实现进程间的通讯,比如wm_copydata消息
  • 我倒! WM_COPYDATA进程通信的问题,大家进来看看,挺有意思的!!我再倒...请教
  • 请问如何用WM_COPYDATA消息在两个进程间传递结构体数据
  • 关于WM_COPYDATA
  • WM_COPYDATA的问题
  • WM_COPYDATA的问题,急啊!
  • 关于WM_COPYDATA的问题

关键词

  • 消息
  • null
  • cpd
  • pcopydatastruct
  • 字符串
  • 结束符
  • copydata
  • oncopydata
  • cbdata
  • copydatastruct

得分解答快速导航

  • 帖主:jjggww2000
  • rtdb
  • hwonzor

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo