读书人

PostMessage送後, 接收到的字符串不

发布时间: 2012-03-07 09:13:51 作者: rapoo

PostMessage送後, 接收到的字符串不完整?
各位好! 我用PostMessage函送字符串, 但不能完整接收所送的容. 而用SendMessage函可以接收. 是什呢?


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

const
WM_PostMsg = WM_User + 300;
WM_SendMsg = WM_User + 301;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
procedure WMPostMsg(var Msg: TMessage); message WM_PostMsg;
procedure WMSendMsg(var Msg: TMessage); message WM_SendMsg;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s := Edit1.Text;
PostMessage(Form1.Handle, WM_PostMsg, 0, Integer(s));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
begin
s := Edit1.Text;
SendMessage(Form1.Handle, WM_PostMsg, 0, Integer(PChar(s)));
end;

//PostMessage方法送的不能完整接收?
procedure TForm1.WMPostMsg(var Msg: TMessage);
var
p: PChar;
begin
p := PChar(Msg.LParam);
Memo1.Lines.Add( 'Post: ' + p);
end;

//SendMessage方法送的可以正常接收
procedure TForm1.WMSendMsg(var Msg: TMessage);
var
p: pchar;
begin
p := PChar(Msg.LParam);
Memo1.Lines.Add( 'Send: ' + p);
end;

end.

[解决办法]
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s := Edit1.Text + #0;
PostMessage(Form1.Handle, WM_PostMsg, 0, Integer(s));
end;
[解决办法]
procedure TForm1.Button2Click(Sender: TObject);
var
s: string; < < <--- 不要使用局部变量。因为Post不是立即响应,等到接受的时候,局部变量的内存已经被释放。指针所指的地址无效了。
begin
s := Edit1.Text;
SendMessage(Form1.Handle, WM_PostMsg, 0, Integer(PChar(s)));
end;

读书人网 >.NET

热点推荐