PostMessage發送後, 接收到的字符串不完整?该怎么解决
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;
各位好! 我用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;