作者:哈铁鸡西青年志愿者 | 来源:互联网 | 2023-08-18 20:10
先说明一下:要将一个结构体从CTestDlg传到CDetailDlg并显示相关内容,其中结构体如下structSMSG{CStringsName;CStringsIP;
先
说明一下:
要将一个结构体从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_str=p->sContent[i];
m_list.AddString(m_str);//将每条内容加到列表框
}
UpdateData(FALSE);
}
结果在DetailDlg里显示的内容都是乱码。。。怎么解决?
12 个解决方案
看看是不是作用域的问题,因为postmessage是异步的,它会立马返回,如果在OnShowMsg中,你的那个东西已经超出其作用域了,就会出现这个问题,有的时候程序还会crash
SMSG* p=(SMSG*)&lParam;
改成 SMSG* p=(SMSG*)lParam;
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.
不建议PostMessage传递结构体,因为它是异步的,另外它还可能会失败,因为它走消息队列,当消息队列满了的时候就会失败。而SendMessage不走消息队列,直接Call窗口过程,所以你应该用SendMessage。