解决PostMessage发送字符串造成数据错乱问题
来源:互联网 发布:神奇表盘 网络错误 编辑:程序博客网 时间:2024/06/08 03:58
以前一直使用PostMessage来发送字符串数据到主界面,由于字符串是临时变量,而PostMessage是异步发送,有时候由于主界面接收到数据的时候,系统已经将字符串占用的内存释放了,造成获取的字符串可能出现乱码的现象!
经过分析,主要是由于PostMessage是异步操作造成的。因为TMessage中的WParam是数值型,所以我们发送消息就只能发送字符串的起始地址,然后在接收端通过起始地址获得这个字符串的值。但是这样做会有一个隐形的问题,就是在栈上分配的内存,会在当前作用域结束后释放掉。
比如:
procedure Send();varmess:string;beginmess:='Hello World!';postmessage(WinHandle,WM_MESSAGE,Integer(PChar(Mess)),0);//Do Somethingend;
这里,我们发送了字符串起始地址的值到指定句柄中,然后这样接收
procedure Recieve(Var ms:TMessage);varmess:string;beginmess:=PChar(ms.WParam);end;
这时候就可以获得接收到的字符串。可是由于PostMessage是异步,不等待Revieve处理完后就反悔了,继续往下面执行。仔细查看Send函数,你会发现postmessage执行完后,该过程就结束,那么这个局部变量mess就会被回收,它所占用的内存空间里面的值可能会被其他数据占用,从而导致在Revcieve的时候,你接收到的值不正确。
如:Hello World!*&**
那么,如何才能避免这种情况?
首先,我们应该手动申请一段内存空间,在堆上申请的内存需要自己手动释放。
我们使用New方法来申请内存,使用Dispose来释放申请的内存。
然后将程序改动一下!
procedure Send();varmess:string;ps:PString;beginNew(ps)mess:='Hello World!';ps^:=mess;postmessage(WinHandle,WM_MESSAGE,Integer(ps),0);end;
再来看接收端
procedure Recieve(Var ms:TMessage);varmess:string;PS:PString;beginPS:=PString(Mess.WParam);mess:=PS^;//Do SomethingDispose(PS);end;
这样,就不会造成由于内存空间释放而产生乱码了!
- 解决PostMessage发送字符串造成数据错乱问题
- listview复用后数据错乱问题的解决
- ListView 数据错乱问题的解决(CheckBox)
- 解决recycleview动态添加条目后,item上的edit输入数据造成的数据错乱
- php多进程造成数据错乱
- listview复用 数据重复 id错乱问题已解决
- Android 解决Listview条目里面有Edittext数据错乱问题
- gridview中使用CheckBox,解决CheckBox数据加载错乱问题
- PostMessage发送字符串和结构体
- 解决Xcode模拟器错乱问题
- 解决ListView加载错乱问题
- 解决Checkbox滑动错乱问题
- 解决listview条目错乱问题
- 解决RabbitMQ发送数据为空字符串
- RecyclerView EditText 数据错乱问题
- SubmitOncePage:解决刷新页面造成的数据重复提交问题
- 解决刷新页面造成的数据重复提交问题
- SubmitOncePage:解决刷新页面造成的数据重复提交问题
- Android SDK API 13升级指南
- 解析Java中抽象类和接口的区别
- 如何防止头文件被重复包含、嵌套包含
- 测试 代码
- Struts2的工作机制及分析(转)
- 解决PostMessage发送字符串造成数据错乱问题
- USACO 1.1 Greedy Gift Givers
- CMarkup概述
- 浅谈恶意代码的研究分析
- hdu 1081 To The Max最大连续子串和
- P4想格式化的时候只有fat32
- C++断点调试方法
- 模拟器不能拨打电话 Android.process.acore has stopped unexpectedly
- uninstall oracle 11g in win 7