我在delphi2010中写了以下代码测试wm_copydata传送数据,但发现总是乱码:
传送端:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure SendText(hwndSend:THandle;str:string);
public
{ Public declarations }
end;const
Mesg=1600;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
fhandle:THandle;
begin
fhandle:=FindWindow(nil,'测试接收WM_COPYDATA');
if fhandle>0 then
SendText(fhandle,Edit1.text);
end;procedure TForm1.SendText(hwndSend:THandle;str: string);
var
buf:pchar;
bufflength:integer;
databuffer:TCopyDataStruct;
begin
bufflength:=length(str)+1;
buf:=allocmem(bufflength);
Strcopy(buf,PChar(str));
try
databuffer.dwData:=Mesg;
databuffer.cbData:=bufflength;
databuffer.lpData:=buf; SendMessage(hwndSend,WM_COPYDATA,handle,LongInt(@databuffer));
finally
freemem(buf,bufflength);
end;
end;end.
接收端:
unit receive;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;CONST
cMsg=1600;type
TForm1 = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
procedure WMCOPYData(var Mesg:TMessage);message WM_COPYDATA;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.WMCOPYData(var Mesg: TMessage);
var
s:string;
begin
if PCopyDataStruct(Mesg.lParam)^.dwData=cMsg then
begin
s:=Pchar(PCopyDataStruct(mesg.lparam)^.lpData);
Memo1.Lines.add(s);
end;
end;end.
出现二个奇怪问题:
1、在delphi2010中,接收端显示的数据是乱码。
2、在delphi7中上面的代码执行正常,接收端可以正常接收发送端发过来的字符串。
但是如果将接收端的WMCOPYDATA方法中的
s:=Pchar(PCopyDataStruct(mesg.lparam)^.lpData);
Memo1.Lines.add(s);
改成memo1.lines.add(Pchar(PCopyDataStruct(mesg.lparam)^.lpData)),则在接收端中也显示为乱码。造成上述问题的原因是什么??还请各位高手指点,谢谢!
传送端:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure SendText(hwndSend:THandle;str:string);
public
{ Public declarations }
end;const
Mesg=1600;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
fhandle:THandle;
begin
fhandle:=FindWindow(nil,'测试接收WM_COPYDATA');
if fhandle>0 then
SendText(fhandle,Edit1.text);
end;procedure TForm1.SendText(hwndSend:THandle;str: string);
var
buf:pchar;
bufflength:integer;
databuffer:TCopyDataStruct;
begin
bufflength:=length(str)+1;
buf:=allocmem(bufflength);
Strcopy(buf,PChar(str));
try
databuffer.dwData:=Mesg;
databuffer.cbData:=bufflength;
databuffer.lpData:=buf; SendMessage(hwndSend,WM_COPYDATA,handle,LongInt(@databuffer));
finally
freemem(buf,bufflength);
end;
end;end.
接收端:
unit receive;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;CONST
cMsg=1600;type
TForm1 = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
procedure WMCOPYData(var Mesg:TMessage);message WM_COPYDATA;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.WMCOPYData(var Mesg: TMessage);
var
s:string;
begin
if PCopyDataStruct(Mesg.lParam)^.dwData=cMsg then
begin
s:=Pchar(PCopyDataStruct(mesg.lparam)^.lpData);
Memo1.Lines.add(s);
end;
end;end.
出现二个奇怪问题:
1、在delphi2010中,接收端显示的数据是乱码。
2、在delphi7中上面的代码执行正常,接收端可以正常接收发送端发过来的字符串。
但是如果将接收端的WMCOPYDATA方法中的
s:=Pchar(PCopyDataStruct(mesg.lparam)^.lpData);
Memo1.Lines.add(s);
改成memo1.lines.add(Pchar(PCopyDataStruct(mesg.lparam)^.lpData)),则在接收端中也显示为乱码。造成上述问题的原因是什么??还请各位高手指点,谢谢!
bufflength:=length(str)+1;
在d2009,比如有兩個漢字,length返回的是2,所以這里你要改為
bufflength:=length(str)*SizeOf(Char)+1
但为何D7中一定要先把消息传递过来的值赋给字符串变量S后,再放到memo中,显示才正常,
而如果直接显示消息传递过来的,就不对呢?还请指定,谢谢!
我到2010再试试上述方法,再次感谢楼上几个高手!!!
記得要改為
bufflength:=length(str)*SizeOf(Char)+2 存放中止符號 / 0
Avan_Lau十分感谢您的再次提醒!谢谢!!