我在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)),则在接收端中也显示为乱码。造成上述问题的原因是什么??还请各位高手指点,谢谢!

解决方案 »

  1.   

    procedure WMCopyData(var Msg : TWMCopyData); message WM_COPYDATA;
      

  2.   

    2010默认unicode编码,delphi7是ansi编码,这样某些类型的长度就变了,所以产生乱码,你要统一好数据格式,保证长度一致
      

  3.   

    問題出在這里:
      bufflength:=length(str)+1;
    在d2009,比如有兩個漢字,length返回的是2,所以這里你要改為
    bufflength:=length(str)*SizeOf(Char)+1
      

  4.   

    十分感谢!
    为何D7中一定要先把消息传递过来的值赋给字符串变量S后,再放到memo中,显示才正常,
    而如果直接显示消息传递过来的,就不对呢?还请指定,谢谢!
      

  5.   

    d7中有可能是我用了d2010的接收端,汗死!搞得让我以为D7中也不行。今天早上重新在D7中编译过上面二个代码,发现可以。:(,真是抱歉!!!
    我到2010再试试上述方法,再次感谢楼上几个高手!!!
      

  6.   

    bufflength:=length(str)*SizeOf(Char)+1
    記得要改為
    bufflength:=length(str)*SizeOf(Char)+2 存放中止符號 / 0
      

  7.   

    嗯,明白!最后一个字符是#0,而在delphi2010中,一个字符是占二个字节。
    Avan_Lau十分感谢您的再次提醒!谢谢!!
      

  8.   

    最后是怎么改的啊,改成bufflength:=length(str)*SizeOf(Char)+2后还是乱码啊