A进程给B进程发送WM_COPYDATA消息,B中消息处理有疑问!!
A中:
int i = 1;//这里初始化i为1
CString  str;
str.Format(_T("无法打开源文件:%d"),i);//注意这里有中文,冒号是英文形式的
COPYDATASTRUCT m_copyDATA;//COPYDATA结构
m_copyDATA.cbData = str.GetLength();//str.GetLength()的值是16
m_copyDATA.lpData = str.GetBuffer(0);//取指针
::SendMessage(m_hWnd,WM_COPYDATA,NULL,(LPARAM)&m_copyDATA);//m_hWnd是进程B的句柄B中的处理(就处理WM_COPYDATA消息的部分,这里有疑问):
if(WM_COPYDATA == message)
{
   COPYDATASTRUCT *p = NULL ;
   p = (COPYDATASTRUCT*)lParam;//对应结构的转换
   CString strTemp;
   memcpy(strTemp.GetBuffer(0),p->lpData,p->cbData);//这里p->cbData还是16,我怀疑这
                                                                              //里strTemp.GetBuffer(0)参数不对
   AfxMessageBox(strTemp);//显示"无法打开源文件:1satltemp.h",多了“satltemp.h”              @1为什么???
   int Len = strTemp.GetLength();//Len居然是0,  @2 memcpy()对字符串指针的操作起了什么作用????
}
将其改成如下这样就正常:
if(WM_COPYDATA == message)
{
   COPYDATASTRUCT *p = NULL ;
   p = (COPYDATASTRUCT*)lParam;
   CString strTemp;
   char str[MAX_PATH];
   memcpy(str,p->lpData,p->cbData);
   strTemp = str;
   strTemp = strTemp.Left(p->cbData);
   AfxMessageBox(strTemp);//显示"无法打开源文件:1",没有多出内容
   int Len = strTemp.GetLength();//这里也得到正常值
}
2个加@的地方请大家解答一下,@1的地方是不是和中英文有关?不过好象全英文也有这个问题

解决方案 »

  1.   

    为了说明问题,上面m_hWnd变量,没有用ReleaseBuffer()等问题请别在意
      

  2.   

    B中的处理(就处理WM_COPYDATA消息的部分,这里有疑问):
    if(WM_COPYDATA == message)
    {
       COPYDATASTRUCT *p = NULL ;
       p = (COPYDATASTRUCT*)lParam;//对应结构的转换
       CString strTemp;
       memcpy(strTemp.GetBuffer(p->cbData+1),p->lpData,p->cbData);
                               ^^^^^^^^^^^^^//这里p->cbData还是16,我怀疑这
                                                                                  //里strTemp.GetBuffer(0)参数不对
       AfxMessageBox(strTemp);//显示"无法打开源文件:1satltemp.h",多了“satltemp.h”              @1为什么???
       int Len = strTemp.GetLength();//Len居然是0,  @2 memcpy()对字符串指针的操作起了什么作用????新的CString中buffer长度为0;GetBuffer如果指定长度,CString负责分配一段不小于size的内存。memcpy只是copy内存,不会增加CStirng内容的长度。