1、编程语言为delphi;
2、通信的单位为一个记录(Record);
3、两个程序在同一台机子上运行。请问怎样用代码实现两个程序之间的通信?
包括从程序A发送一个记录给程序B,从程序B发送
一个记录给程序A。小弟愚钝,还望大虾们能够提供具体的代码。

解决方案 »

  1.   

    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure p(var msg:twmcopydata);message wm_copydata;
      end;var
      Form1: TForm1;implementation{$R *.DFM}
    type
      pdata=^tdata;
      tdata=record
        name:string[100];
        author:string[100];
      end;procedure tform1.p(var msg:twmcopydata);
    var
      k:pdata;
    begin
      k:=msg.CopyDataStruct.lpdata;
      showmessage('name:'+k^.name);
      showmessage('author:'+k^.author);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      buf:pdata;
      t:tcopydatastruct;
    begin
      buf^.name:='hello';
      buf^.author:='hey';
      t.dwdata:=1;
      t.cbdata:=sizeof(buf^);
      t.lpdata:=buf;
      sendmessage(handle,wm_copydata,handle,longint(@t));
    end;end.
    转成两个程序的五分钟够吗,哈哈。
      

  2.   

    to robinhunter(深空) :你这样是不行的,两个程序就是两个进程,他们的地址是不一样的,你把
    t的地址传过去没有用的。两个进程之间的通信涉及到进程间通信的问题,一般可以通过FileMapping或
    管道(nt才行)等进行。
      

  3.   

    to : Nicrosoft(奈软==申旻)(生活就是折腾) 
      老兄高见,我怎么就没想到呢。那就用filemapping吧。
      

  4.   

    windows消息非常好,可以实现许多想不到的功能
    这是我原来写的,一般不是这样用的
    一般使用管道数据通信的.
      

  5.   

    查了一下wm_copydata的帮助:
    The WM_COPYDATA message is sent when an application passes data to another application. 
    应该可以这样用的,也许访问其它进程的内存空间的限制在消息机制中不起作用吧。
      

  6.   

    你要在进程之间传递record?没问题!
    用这个类,使用下面的函数:
     function Send(AHandle:Cardinal;P:pointer;Len:integer;wParam:integer=0;dwData:cardinal=0):integer;overload;
    其中的p就是你的recird的地址,用@取得,len就是sizeof(你的record);
    ///////////////////////////////////////////////////////////
    unit ShareMem_San;
    interface
    uses
    windows,messages,sysutils,debug_san;/////////////////////////////////////
    type
      TCopyData_San=class
      private
        CD:TcopyDataStruct;
        procedure SetData(p:pointer;len:integer;dwData:cardinal);
      public
        function Send(AHandle:Cardinal;AStr:string;wParam:integer=0;dwData:cardinal=0):integer;overload;
        function Send(AHandle:Cardinal;P:pointer;Len:integer;wParam:integer=0;dwData:cardinal=0):integer;overload;  end;
    ///////////////////////
    function GetCopyData(AMsg:TWMCopyData):string;overload;
    procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);overload;implementation
    procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);
    begin
      p:=amsg.CopyDataStruct.lpData;
      len:=amsg.CopyDataStruct.cbData;
    end;
    function GetCopyData(AMsg:TWMCopyData):string;
    var
    i,len:integer;
    type
    pstr=array of char;
    begin
      result:='';
      len:=amsg.CopyDataStruct.cbData;
      if len<=0 then exit;
      setlength(result,len);
      for i:=1 to len do
      begin
        result[i]:=pstr(amsg.CopyDataStruct.lpData)[i-1];
      end;
    end;{ TCopyData_San }function TCopyData_San.Send(AHandle: Cardinal; AStr: string;wParam:integer=0;dwData:cardinal=0): integer;
    var
    len:integer;
    begin  len:=length(astr);
      
      if len<=0 then exit;
        result:=send(ahandle,@astr[1],len,wparam,dwdata);end;function TCopyData_San.Send(AHandle: Cardinal; P: pointer;
      Len: integer;wParam:integer=0;dwData:cardinal=0): integer;
    begin
      setdata(p,len,dwdata);
      result:=sendmessage(ahandle,wm_copydata,wparam,Cardinal(@cd));
    end;procedure TCopyData_San.SetData(p: pointer; len: integer;dwData:cardinal);
    begin
      cd.cbData:=len;
      cd.lpData:=p;
      cd.dwData:=dwData;
    end;
    ////////////////////////////end.
      

  7.   

    AHandle就是就手进程的窗口句炳。
    这个单元提供了2个工具函数:
    function GetCopyData(AMsg:TWMCopyData):string;overload;
    procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);overload;
    在你的接收程序里面(如果也是用delphi作的话),
    处理wm_copydata消息,把msg参数传进去,你就能得到发来的record的指针和长度。
    ////////////////////////////
    怎样处理wm_copydata消息?在你的窗体单元的private部分写:
    procedure HandleCopydata(var msg:tmessage);message wm_copydata;
    然后按crel+shift+c,你就可以在这里处理wm_copydata消息,并用
    function GetCopyData(AMsg:TWMCopyData):string;overload;
    得到你的那个record的所有信息!
      

  8.   

    错了,用这个:
    procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);overload;