说明一下:
要将一个结构体从CTestDlg传到CDetailDlg并显示相关内容,其中结构体如下
struct SMSG
{
CString sName;
CString sIP;
CString sContent[20];
int iNum;//计数
};
我的做法
先在TestDlg中定义SMSG msgs;并完善结构体的信息。然后按一个按钮,先生成一个非模态对话框DetailDlg,然后::PostMessage(hWindow,WM_SHOWMSG,0,(LPARAM)&msgs);//hWindow是DetailDlg的句柄,且经检测,此时msgs中的内容是完好无损的在DetailDlg.h中定义一个自定义消息,并添加处理函数
#define WM_SHOWMSG WM_USER+105
afx_msg void OnShowMsg(WPARAM wParam,LPARAM lParam);
ON_MESSAGE(WM_SHOWMSG,OnShowMsg)void CDetailDlg::OnShowMsg(WPARAM wParam,LPARAM lParam)
{
SMSG* p=(SMSG*)&lParam;
m_strName=p->sName;
m_strIP=p->sIP;
m_iNum=p->iNum;//m_strName、m_strIP、m_iNum是3个编辑框关联的变量
for(int i=0;i<m_iNum;i++)
{
m_str=p->sContent[i];
m_list.AddString(m_str);//将每条内容加到列表框
}
UpdateData(FALSE);
}结果在DetailDlg里显示的内容都是乱码怎么解决?

解决方案 »

  1.   

    看看是不是作用域的问题,因为postmessage是异步的,它会立马返回,如果在OnShowMsg中,你的那个东西已经超出其作用域了,就会出现这个问题,有的时候程序还会crash
      

  2.   

    作用域是什么,怎么看?如果改成::SendMessage还是乱码
      

  3.   

    结构体new 出来再传地址过去
      

  4.   

     SMSG* p=(SMSG*)&lParam;
    改成 SMSG* p=(SMSG*)lParam;
      

  5.   

    不知道你说的是不是这样:
    SMSG* msgs=new SMSG;
    完善好信息后
    ::PostMessage(hWindow,WM_SHOWMSG,0,(LPARAM)msgs);//此时的msgs指向的内容也是完好无损的
    但是结果还是乱码
      

  6.   

    嘿嘿,这个不错。但是还是有个小问题,就是结构体中的CString sContent[20];会出现乱码,而且奇怪的是,最后一条不是乱码。比如说有5条内容,sContent[4],那么最后一条内容是完好的,前面4条就乱码了。
      

  7.   

    也就是说运行会崩溃for(int i=0;i<m_iNum;i++)
        {
            m_str=p->sContent[i];//调试的时候,到这里就终止了,不能继续
            m_list.AddString(m_str);//将每条内容加到列表框
        }
      

  8.   

    MSDN中关于PostMessage好像有个说法,也许和这个说明有关:
    If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters cannot include pointers. Otherwise, the operation will fail. The functions will return before the receiving thread has had a chance to process the message and the sender will free the memory before it is used.
      

  9.   

    不建议PostMessage传递结构体,因为它是异步的,另外它还可能会失败,因为它走消息队列,当消息队列满了的时候就会失败。而SendMessage不走消息队列,直接Call窗口过程,所以你应该用SendMessage。
      

  10.   


    好消息好消息,问题解决了,解决办法:
    在4楼的基础上,把::PostMessage改成::SendMessage就行了,因为我看到8楼大哥提供的信息里没有说SendMessage会怎么怎么样,哈哈我的思想被禁锢了,我总是认为SMSG* p=(SMSG*)&lParam;这里面是一定要有'&'的先吃饭,回来结帖