关于PostMes发送结构体问题

yuanweihuayan 2010-09-16 09:59:20
我有一段程序,大致是利用PostMessage发送结构体Student:
#define WM_SEND WM_USER + 100
struct Student
{
CString Name;
CString Sex;
CString Scroe;
};
其中发送消息的代码如下:
Student stu;stu.Name = "ANDY LAU";stu.Sex = "男";stu.Scroe = "100";
PostMessage(WM_SEND,0,(LPARAM)&stu);
接收消息的代码如下:
void CTest0913Dlg::GetDataFun(WPARAM wParam,LPARAM lParam)
{
Student* s=(Student *)lParam;
MessageBox(s->Name);
MessageBox(s->Scroe);
MessageBox(s->Sex);
}
但是却出现问题,显示的是乱码。加入我把发送消息改下,就没有问题,这是什么原因?
Student stu;stu.Name = "ANDY LAU";stu.Sex = "男";stu.Scroe = "100";
if(PostMessage(WM_SEND,0,(LPARAM)&stu))
{
MessageBox("代码发送成功");
}
...全文
311 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyzjanker 2010-09-25
  • 打赏
  • 举报
回复
postmessage只管发送,不等待消息处理返回,你调用它之后,你程序立即就退出了,随之的局部变量也被销毁!!!此时可能接受端才刚开始处理消息!!!这样就乱码啦!
所以。。。。。
而你加了后面的代码后,局部变量不会被销毁,if语句会等待消息返回!
QQ282881515 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xianglitian 的回复:]
你那一面的是个临时变量
PostMessage之后函数退出了
所以临时变量释放了
要么你用new在堆上分配一个
要么用SendMessage
[/Quote]
up
lijianli9 2010-09-25
  • 打赏
  • 举报
回复
你理解了sendmessage和postmessage的工作原理,这个问题就好解决了,
yuanweihuayan 2010-09-25
  • 打赏
  • 举报
回复
谢了!
two_ears 2010-09-21
  • 打赏
  • 举报
回复
但是这样和直接调用函数没什么太大分别,使用对内存才是好的选择
two_ears 2010-09-21
  • 打赏
  • 举报
回复
看样子应该是模式对话框显示之前会先等待消息队列里的消息处理完毕,所以postmessage之后立即调用messagebox会先处理自定义消息,这个时候局部变量尚未释放所以能得到显示
这个lz应该查一下msdn,但不论msdn有没有说明这个问题,lz都应该按照上面几位说的正确方法分配内存或改用sendmessage,sendmessage不进消息队列,lz可以尝试一下类似这样的代码
postmessage(WM_USER,1);
sendmessage(WM_USER,2);
.....
OnMessage(...)
{
TRACE(_T("%u\n"),wParam);
}
会先显示2再显示1,也就是2没有排队,所以sendmessage即便发送局部变量的地址,内存也不会失效
wolffan3150 2010-09-16
  • 打赏
  • 举报
回复
#define WM_SEND WM_USER + 100
struct Student
{
CString Name;
CString Sex;
CString Scroe;
};
void ::SendStudentInfor()
{
Student stu;
stu.Name = "ANDY LAU";stu.Sex = "男";stu.Scroe = "100";
PostMessage(WM_SEND,0,(LPARAM)&stu);
}

void CTest0913Dlg::GetDataFun(WPARAM wParam,LPARAM lParam)
{
Student* s=(Student *)lParam;
MessageBox(s->Name);
MessageBox(s->Scroe);
MessageBox(s->Sex);
}
如果是这样定义stu,
出了函数SendStudentInfor,stu就被释放了,GetDataFun当然拿不到具体数,属于越界访问
========================
1。
Student stu;

void ::SendStudentInfor()
{

stu.Name = "ANDY LAU";stu.Sex = "男";stu.Scroe = "100";
PostMessage(WM_SEND,0,(LPARAM)&stu);
}
================
2。

void ::SendStudentInfor()
{
Student *stu =new Student

PostMessage(WM_SEND,0,(LPARAM)&stu);
}

这样stu就不会被释放
alexmayer 2010-09-16
  • 打赏
  • 举报
回复
1、使用SendMessage,必须等待返回才能销毁结构。

或者

2、new Student,然后PostMessage,在消息处理中delete掉new出来的指针。
yuchongjike 2010-09-16
  • 打赏
  • 举报
回复
Student stu设成全局变量
QQ282881515 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xianglitian 的回复:]
你那一面的是个临时变量
PostMessage之后函数退出了
所以临时变量释放了
要么你用new在堆上分配一个
要么用SendMessage
[/Quote]

UP 应该new出来一块地方,发送数据就不用担心它的生命周期,等你处理完数据之后再将其delete掉。。
Eleven 2010-09-16
  • 打赏
  • 举报
回复
同意ls说的。。。
向立天 2010-09-16
  • 打赏
  • 举报
回复
你那一面的是个临时变量
PostMessage之后函数退出了
所以临时变量释放了
要么你用new在堆上分配一个
要么用SendMessage
dengzikun 2010-09-16
  • 打赏
  • 举报
回复
发送指针,需要确保接收消息时指针指向的内存块有效且内存块内容没有被破坏.
zhaohongbo83 2010-09-16
  • 打赏
  • 举报
回复
是不是要用网络字节转换一下!乱码也就是这种可能了!
昨夜无风 2010-09-16
  • 打赏
  • 举报
回复
用SendMessage
重复的昵称嘛 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yuanweihuayan 的回复:]
首先谢谢大家的回答,我还想问下:
1。我这里并没有在两个线程里面做啊。为什么会出现这种情况啊!
2。我如果加入后面那段代码就没有问题啊 。显示正确。
[/Quote]
了解下PostMessage与SendMessage的区别,还有队列消息和非队列消息.
有时候明明是一个单线程程序,但是在调试输出窗口经常看到“xxx线程退出了”。。。我也没明白为什么。请高手一并讲解吧。
重复的昵称嘛 2010-09-16
  • 打赏
  • 举报
回复
楼上几位已经说明白原因了,变量生存期问题,
如果局部变量,则用SendMessage
否则,SM/PM都可以用.
yuanweihuayan 2010-09-16
  • 打赏
  • 举报
回复
首先谢谢大家的回答,我还想问下:
1。我这里并没有在两个线程里面做啊。为什么会出现这种情况啊!
2。我如果加入后面那段代码就没有问题啊 。显示正确。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧