首页 > 其他分享 >解决PostMessage发送字符串造成数据错乱问题

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

时间:2022-11-23 00:23:28浏览次数:54  
标签:PostMessage string mess 发送 字符串 内存 错乱



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

标签:PostMessage,string,mess,发送,字符串,内存,错乱
From: https://www.cnblogs.com/xionda/p/16916980.html

相关文章

  • 最常见的单词 最短补全词 反转字符串中的单词 III
    819.最常见的单词关键思路就是,把文章转化为单词数组;然后把需要剔除的单词放入一个HashMap中,再把不含需要剔除的单词放入另一个HashMap中;找出其中value最大的即可;para......
  • 字符串杂题
    字符串杂题。P5446[THUPC2018]绿绿和串串一个回文中心\(i\),如果右端点能到字符串末尾,或者左端点能到开头且\(2i-1\)合法,则\(i\)合法。马拉车乱搞就行了,记得清空。......
  • 鏖战字符串
    C:鏖战字符串时间限制: 1Sec  内存限制: 128MB题目描述Abwad在nbc即将完成她的程序的时候,急中生智拔掉了她电脑的电源线,争取到了宝贵的时间。作为著名论文《论Ct......
  • JS前期数组、字符串、时间、定时器、DOM\BOM事件方法等总结
    1.字符串方法        .charAt(对应字符元素下标)——根据下标查找字符串内元素        .charCodeAt(对应字符元素下标)——根据下标查找字符串某元素在u......
  • 第五节、字符串
    第五节、字符串第一节基础知识1.每个字符都有对应的整数ASCII码,常用ASCII值,’A''Z'是6590,‘a''z'是97122,’0‘’9'是4857,字符可以参与运算,运算时会将其当作整数。(记住)......
  • 字符串
    字符串比较          字符串理解       ......
  • 20221122-Python格式化字符串
    1.格式化字符串       ......
  • FileReader之获取文本文件内容为字符串
    FileReader之获取文本文件内容为字符串FileReader官网描述:FileReader对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用File或Blob......
  • C语言字符串
    文章目录​​一、字符串的概念​​​​二、占用内存的情况​​​​三、字符串的初始化​​​​四、字符串与指针​​​​五、字符串的结尾标志​​​​六、字符串的输出​​......
  • Newtonsoft的高级玩法,让你的json字符串与众不同
    json一经出现就得到多很多开发员的青睐,数据传输直接取代了之前的xml格式,不过也确实非常好用。关于json的常用操作,可以参考这篇文章。今天要分享的是Newtonsoft这个类库对Js......