消息发送:
procedure TClient.Button1Click(Sender: TObject);
var WindowName:string;
Hwd:HWND;     //窗体句柄类型
begin
   WindowName:='Server';
   Hwd:=FindWindow(nil,PWideChar(windowname));
   if(Hwd=0)then
   begin
     ShowMessage('句柄没找到!');
     exit;
   end;
   if(Edit1.Text<>'')then
   begin
     SendMessageTo(Hwd,edit1.Text);
   end;
end;procedure TClient.SendMessageTo(Hwd: HWND; var SendStr: string);
var DataStruct:TCopyDataStruct;
begin
  DataStruct.dwData:=0;
  DataStruct.cbData:=0;
  DataStruct.lpData:=@SendStr;
  SendMessage(Hwd,WM_COPYDATA,0,LongInt(@DataStruct));
end;接收:
procedure TForm2.WMCopyData(var M: TMessage);
var CopyData:TCopyDataStruct;
msgstr:string;
begin
  CopyData:=TCopyDataStruct(Pointer(m.LParam)^);
  msgstr:=string(PChar(Pointer(CopyData.lpData)^));
  ShowMessage(msgstr);
end;接收端接收的数据全是乱码,不知道怎么搞的,请大神帮忙看看

解决方案 »

  1.   


    消息发送:
    procedure SendMessageTo(Hwd: HWND; var SendStr: string);
    ....procedure TForm1.btn1Click(Sender: TObject);
    var
      WindowName: string;
      Hwd: HWND; //窗体句柄类型
      data: string;
    begin
      WindowName := 'form2';
      Hwd := FindWindow(nil, PChar(windowname));
      if (Hwd = 0) then
      begin
        ShowMessage('句柄没找到!');
        exit;
      end;
      if (edt1.Text <> '') then
      begin
        data := edt1.Text;
        SendMessageTo(Hwd, data);
      end;
    end;procedure TForm1.SendMessageTo(Hwd: HWND; var SendStr: string);
    var
      DataStruct: TCopyDataStruct;
      data: PChar;
      dataSize: Integer;
    begin
      data := StrAlloc(Length(SendStr) + 1);
      dataSize := StrBufSize(data);
      ZeroMemory(data, dataSize);
      CopyMemory(data,@SendStr[1],dataSize);
      DataStruct.dwData := WM_COPYDATA;
      DataStruct.cbData := dataSize;
      DataStruct.lpData := data;
      SendMessage(Hwd, WM_COPYDATA, 0, LongInt(@DataStruct));
      StrDispose(data);
    end;
    接收:procedure WMCopyData(var M: TWMCopyData); message WM_COPYDATA;
    ....procedure TForm2.WMCopyData(var M: TWMCopyData);
    begin
      edt1.Text := PChar(M.CopyDataStruct.lpData);
    end;
      

  2.   

    DataStruct.dwData dword类型数据,可以为0
    DataStruct.cbData 传送数据的长度,字节为单位
    DataStruct.lpData 指针类型数据,可以为空
    这类问题其实看一下MSDN就有答案了嘛,如果不会英文就有道词典啊,
    长篇大论不行,看几个单词怎么也不会有问题嘛COPYDATASTRUCT Structure--------------------------------------------------------------------------------The COPYDATASTRUCT structure contains data to be passed to another application by the WM_COPYDATA message. Syntaxtypedef struct tagCOPYDATASTRUCT {
        ULONG_PTR dwData;
        DWORD cbData;
        PVOID lpData;
    } COPYDATASTRUCT, *PCOPYDATASTRUCT;
    MembersdwData
    Specifies data to be passed to the receiving application. 
    cbData
    Specifies the size, in bytes, of the data pointed to by the lpData member. 
    lpData
    Pointer to data to be passed to the receiving application. This member can be NULL. 
      

  3.   

    谢谢高人替我解答,我还有一点不懂得是,原本两个程序之间是不能直接访问对方内存的,WM_COPYDATA实现了两个程序之间的内存共享,简而言之,就是他们之间可以相互访问对方内存了,我直接传一个指针过去,在接受端直接读取指针不知道行不行?我的出现乱码的原因不知道是DataStruct.cbData:=0;不知道是数据的长度没给的原因还是
    msgstr:=string(PChar(Pointer(CopyData.lpData)^))类型转换出问题了
      

  4.   

    谢谢高人替我解答,我还有一点不懂得是,原本两个程序之间是不能直接访问对方内存的,WM_COPYDATA实现了两个程序之间的内存共享,简而言之,就是他们之间可以相互访问对方内存了,我直接传一个指针过去,在接受端直接读取指针不知道行不行?我的出现乱码的原因不知道是DataStruct.cbData:=0;不知道是数据的长度没给的原因还是
    msgstr:=string(PChar(Pointer(CopyData.lpData)^))类型转换出问题了不可以直接读到其他程式的内存数据,除非有注入到其他程式的内部。
      

  5.   

    msgstr:=strpas(PChar(Pointer(CopyData.lpData)))
    多了个^
      

  6.   

    谢谢高人替我解答,我还有一点不懂得是,原本两个程序之间是不能直接访问对方内存的,WM_COPYDATA实现了两个程序之间的内存共享,简而言之,就是他们之间可以相互访问对方内存了,我直接传一个指针过去,在接受端直接读取指针不知道行不行?我的出现乱码的原因不知道是DataStruct.cbData:=0;不知道是数据的长度没给的原因还是
    msgstr:=string(PChar(Pointer(CopyData.lpData)^))类型转换出问题了不可以直接读到其他程式的内存数据,除非有注入到其他程式的内部。真的吗?
      

  7.   

    WM_CopyData也不是实现了两个程序之间的内存共享.
    它只是把两个程序的内存块相互复制.
    可以看Windows源代码,底层是ReadProcessMemory实现的.
      

  8.   

     WM_COPYDATA 消息就叫拷贝数据嘛,真是