aLoNe IT Develop Studio

  • 首页
  • IT前沿
  • Web技术
  • 小姿势
  • 运维管理
  • 随笔
欢迎来到aLoNe.Adams.K的个人博客
  1. 首页
  2. 小姿势
  3. 正文

解决PostMessage发送字符串造成数据错乱问题

2016年9月23日 21484点热度 0人点赞 0条评论

以前一直使用PostMessage来发送字符串数据到主界面,由于字符串是临时变量,而PostMessage是异步发送,有时候由于主界面接收到数据的时候,系统已经将字符串占用的内存释放了,造成获取的字符串可能出现乱码的现象!

经过分析,主要是由于PostMessage是异步操作造成的。因为TMessage中的WParam是数值型,所以我们发送消息就只能发送字符串的起始地址,然后在接收端通过起始地址获得这个字符串的值。但是这样做会有一个隐形的问题,就是在栈上分配的内存,会在当前作用域结束后释放掉。

比如:

procedure Send();
var
mess:string;
begin
mess:='Hello World!';
postmessage(WinHandle,WM_MESSAGE,Integer(PChar(Mess)),0);
//Do Something
end;

这里,我们发送了字符串起始地址的值到指定句柄中,然后这样接收

procedure Recieve(Var ms:TMessage);
var
mess:string;
begin
mess:=PChar(ms.WParam);
end;

这时候就可以获得接收到的字符串。可是由于PostMessage是异步,不等待Revieve处理完后就反悔了,继续往下面执行。仔细查看Send函数,你会发现postmessage执行完后,该过程就结束,那么这个局部变量mess就会被回收,它所占用的内存空间里面的值可能会被其他数据占用,从而导致在Revcieve的时候,你接收到的值不正确。

如:Hello World!*&**

那么,如何才能避免这种情况?

首先,我们应该手动申请一段内存空间,在堆上申请的内存需要自己手动释放。

我们使用New方法来申请内存,使用Dispose来释放申请的内存。

然后将程序改动一下!

procedure Send();
var
mess:string;
ps:PString;
begin
New(ps)
mess:='Hello World!';
ps^:=mess;
postmessage(WinHandle,WM_MESSAGE,Integer(ps),0);
end;

再来看接收端

procedure Recieve(Var ms:TMessage);
var
mess:string;
PS:PString;
begin
PS:=PString(Mess.WParam);
mess:=PS^;
//Do Something
Dispose(PS);
end;

这样,就不会造成由于内存空间释放而产生乱码了!

标签: 暂无
最后更新:2016年9月23日

aLoNe.Adams.K

一只胖菜鸟!

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章分类
  • IT前沿 / 3篇
  • Web技术 / 2篇
  • 小姿势 / 30篇
  • 运维管理 / 6篇
  • 随笔 / 4篇
标签聚合
google sqlite Yum Orange Pi debian 虚表 CentOS 反向代理
最新 热点 随机
最新 热点 随机
Docker可用的镜像源 念 Github SSH 22端口连接超时解决办法 VSCode插件推荐 Docker内创建SQLServer服务 Cli模式下ThinkPHP框架Redis对象反序列化异常问题解决方案
常见颜色深度的 bitmap 之间的相互转换 念 「微信小程序」有哪些冲击与机会? 使用WSL的Ubuntu18.04安装oneinstack需要注意的相关事项及步骤! 手把手教你Chrome浏览器安装Postman(含下载云盘链接)【转载】 我的座右铭
友情连接
  • 李建伟博客
  • 不忘初心的简书
归档
  • 2024年6月 / 1篇
  • 2024年3月 / 1篇
  • 2024年1月 / 1篇
  • 2023年7月 / 3篇
  • 2023年6月 / 1篇
  • 2022年12月 / 5篇
  • 2022年6月 / 1篇
  • 2022年2月 / 3篇
  • 2020年11月 / 1篇
  • 2018年12月 / 1篇
  • 2018年5月 / 1篇
  • 2018年3月 / 1篇
  • 2017年11月 / 1篇
  • 2017年8月 / 1篇
  • 2017年3月 / 2篇
  • 2017年1月 / 1篇
  • 2016年9月 / 16篇

COPYRIGHT © 2022 aLoNe IT Develop Studio. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19021656号-2