BOOL CUseDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
  //在消息里面启动线程
   AfxBeginThread(func,(LPVOID)&pCopyDataStruct);
}
UINT func(LPVOID p)
{
  COPYDATASTRUCT * cp=(COPYDATASTRUCT *)p;
  MessageBox(NULL,(char *)(cp->lpData),"",0);
}运行时候,对话框要么内容为空,要么就报错“内存不能read...."
请问是什么原因?甚至传递的是char * 都不行?

解决方案 »

  1.   

    //AfxBeginThread(func,(LPVOID)&pCopyDataStruct);
    AfxBeginThread(func,(LPVOID)pCopyDataStruct);
      

  2.   

    因为在你的线程函数执行时指针指向的内容已经失效了,
    正确的做法如下:
    BOOL CUseDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
    {
      // 首先使用静态变量来保存pCopyDataStruct中的内容
      static COPYDATASTRUCT data;
      data = *pCopyDataStruct;
      //在消息里面启动线程
       AfxBeginThread(func,(LPVOID)&data);
    }
      

  3.   

    whoishere(我来也):
       
       我的做法也是你这样的,但是问题是这样的: 消息是不断来的,如果同时来了很多,
    就可能多个线程用到了同一个data值,   就会出现结果错误。
    所以我考虑直接把消息作为参数发送给线程的函数。
      

  4.   

    Cline(营营) :  你说的把&号去掉,我同样试过多次,但好象总没效果,甚至出现"内存不能read“的提示
      

  5.   

    BOOL CUseDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
    {
      // 首先使用静态变量来保存pCopyDataStruct中的内容
      COPYDATASTRUCT *pData = new COPYDATASTRUCT;
      *pData = *pCopyDataStruct;
      //在消息里面启动线程
       AfxBeginThread(func,(LPVOID)&data);
    }UINT func(LPVOID p)
    {
      COPYDATASTRUCT * cp=(COPYDATASTRUCT *)p;
      MessageBox(NULL,(char *)(cp->lpData),"",0);
      delete cp;
    }还有,你确定cp->lpData 有字符串的结束标志吗?
      

  6.   

    你发消息用的是 PostMessage 还是 SendMessage ?
    若用 PostMessage 会出现指针失效的情况。
      

  7.   

    agree with " whoishere(我来也)":
    因为在你的线程函数执行时指针指向的内容已经失效了,
      

  8.   

    BOOL CUseDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
    {
      //在消息里面启动线程
       AfxBeginThread(func,(LPVOID)&pCopyDataStruct);
    }兄弟:
    COPYDATASTRUCT* pCopyDataStruct 就说明pCopyDataStruct 为指针了,你再用(LPVOID)&pCopyDataStruct就又引用了一次也就是说变成二级指针了,只要把“&“去了就可以了
    (LPVOID)就是一个指向指针的