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

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


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

在VB.NET中,可以使用PostMessage函数来发送字符串PostMessage是Windows API的一部分,它允许你发送消息到指定的窗口。 下面是一个示例代码,演示如何使用PostMessage函数发送字符串: ```vb Imports System.Runtime.InteropServices Public Class Form1 ' 导入Windows API中的PostMessage函数 <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As String) As Boolean End Function ' 定义常量 Private Const WM_SETTEXT As UInteger = &HC Private Const WM_KEYDOWN As UInteger = &H100 Private Const WM_KEYUP As UInteger = &H101 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 获取目标窗口的句柄 Dim targetHwnd As IntPtr = FindWindow(Nothing, "目标窗口标题") ' 发送字符串消息 PostMessage(targetHwnd, WM_SETTEXT, IntPtr.Zero, "要发送字符串") End Sub End Class ``` 在上面的示例中,我们首先导入了user32.dll库,并定义了PostMessage函数的签名。然后,我们定义了一些常量,用于指定要发送的消息类型。在按钮的点击事件处理程序中,我们使用FindWindow函数来获取目标窗口的句柄,然后使用PostMessage函数发送字符串消息。 请注意,你需要将"目标窗口标题"替换为你要发送消息的窗口的标题,将"要发送字符串"替换为你要发送的实际字符串。 希望以上信息对你有帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值