发送端:
         HWND hwnd = GetSafeHwnd();
HWND hwndParent = ::GetParent(hwnd);
if(hwndParent != NULL)
{
Message_Param * msg = new Message_Param;
msg->nMsgType = htons(AS_CHAT);
strcpy( msg->userData, UserData);
COPYDATASTRUCT MyCDS;
MyCDS.dwData = htons(AS_CHAT);
MyCDS.cbData = sizeof(Message_Param);
MyCDS.lpData = &msg;
::SendMessage(hwndParent, WM_COPYDATA, (WPARAM)(HWND)hwnd, (LPARAM)(LPVOID)&MyCDS);
}
接收端:
         PCOPYDATASTRUCT pMyCDS;
pMyCDS = (PCOPYDATASTRUCT)pCopyDataStruct;
Message_Param * msg = new Message_Param;
msg = (Message_Param *)pMyCDS->lpData;
其中:
    typedef struct _Message_Parm{
int nMsgType;
char userData[200];
         }Message_Param;问题是:
     这样写对吗?程序抛错。不知道是哪里的问题?
我跟踪进去发现:MyCDS.lpData 这个里存放一个指针,但不是msg的地址。

解决方案 »

  1.   

    PCOPYDATASTRUCT pMyCDS;
    pMyCDS = (PCOPYDATASTRUCT)pCopyDataStruct;
    Message_Param * msg = (Message_Param *)pMyCDS->lpData;
    你不能NEW 一份出来, 直接用传过来的就行了, 两端不同很正常, 因为不是同一个进程.操作系统会在接收消息的进程内重新分配空间的.发送也不对: Message_Param * msg = new Message_Param;  // 不需要new 分配的
    msg->nMsgType = htons(AS_CHAT);
    strcpy( msg->userData, UserData);
    COPYDATASTRUCT MyCDS;
    MyCDS.dwData = htons(AS_CHAT);
    MyCDS.cbData = sizeof(Message_Param);
    MyCDS.lpData = &msg;
    ::SendMessage(hwndParent, WM_COPYDATA, (WPARAM)(HWND)hwnd, (LPARAM)(LPVOID)&MyCDS);
    }
      

  2.   

    PCOPYDATASTRUCT pMyCDS;
    pMyCDS = (PCOPYDATASTRUCT)pCopyDataStruct;
    Message_Param * msg = new Message_Param;
    msg = (Message_Param *)pMyCDS->lpData;//上一句才new了内间,这里在干嘛,应该是memcpy( msg, pMyCDS->lpData, sizeof(pMyCDS);吧
      

  3.   

    在接收端delete msg;时抛错。怎么会这样。我先前都是这样做的。所以没想到会是这里出错。
    而且,接收端接收的
       msg = (Message_Param *)pMyCDS->lpData;//msg值不对。
    我觉得在发送端就可能不对
      MyCDS.lpData = &msg;//这里lpData的值就不是msg的地址。
      

  4.   

    我按krh2001(边城浪子) 说的,直接赋值就OK了。为什么??另:Message_Param * msg = new Message_Param;  // 不需要new 分配的
    那是直接
    Message_Param * msg;
    msg->nMsgType = htons(AS_CHAT);
    strcpy( msg->userData, UserData);不对吧??