一个关于wm_copydata的问题

caike 2010-01-22 12:25:46
我在delphi2010中写了以下代码测试wm_copydata传送数据,但发现总是乱码:
传送端:

unit Unit1;

interface

uses
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;

interface

uses
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)),则在接收端中也显示为乱码。

造成上述问题的原因是什么??还请各位高手指点,谢谢!
...全文
375 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
iqyely 2010-03-15
  • 打赏
  • 举报
回复
最后是怎么改的啊,改成bufflength:=length(str)*SizeOf(Char)+2后还是乱码啊
金卯刀 2010-01-22
  • 打赏
  • 举报
回复
bufflength:=length(str)*SizeOf(Char)+1
記得要改為
bufflength:=length(str)*SizeOf(Char)+2

存放中止符號 / 0
caike 2010-01-22
  • 打赏
  • 举报
回复
d7中有可能是我用了d2010的接收端,汗死!搞得让我以为D7中也不行。今天早上重新在D7中编译过上面二个代码,发现可以。:(,真是抱歉!!!
我到2010再试试上述方法,再次感谢楼上几个高手!!!
虎滴小猪猪 2010-01-22
  • 打赏
  • 举报
回复
先问下楼主是怎样解决你的问题的啊?
caike 2010-01-22
  • 打赏
  • 举报
回复
十分感谢!
为何D7中一定要先把消息传递过来的值赋给字符串变量S后,再放到memo中,显示才正常,
而如果直接显示消息传递过来的,就不对呢?还请指定,谢谢!
金卯刀 2010-01-22
  • 打赏
  • 举报
回复
問題出在這里:
bufflength:=length(str)+1;
在d2009,比如有兩個漢字,length返回的是2,所以這里你要改為
bufflength:=length(str)*SizeOf(Char)+1
bdmh 2010-01-22
  • 打赏
  • 举报
回复
2010默认unicode编码,delphi7是ansi编码,这样某些类型的长度就变了,所以产生乱码,你要统一好数据格式,保证长度一致
dinoalex 2010-01-22
  • 打赏
  • 举报
回复
procedure WMCopyData(var Msg : TWMCopyData); message WM_COPYDATA;
caike 2010-01-22
  • 打赏
  • 举报
回复
嗯,明白!最后一个字符是#0,而在delphi2010中,一个字符是占二个字节。
Avan_Lau十分感谢您的再次提醒!谢谢!!

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧