以前一直使用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;

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

————————————————

版权声明:本文为CSDN博主「wrqlgd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wrqlgd/article/details/6655922

原文地址:http://www.cnblogs.com/xionda/p/16916980.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性