delphi 进程间通信的两种方法

WIN下面进程间通信的最常用办法就是消息了.

下面记录两种消息通信的方式:
 --------------------------------------------------------------------------------------------
一.第一种办法,利用注册Windows全局的消息.并覆盖wndProc过程来监听消息处理.
1. 
    发送消息方:
    private 
            strWM:Cardinal;  //定义一个局部变量
    ...    
    proccedure Form1.Create(sender:TObject);
    begin
        strWM:= RegisterWindowMessage('newspopMessage'); //注册一个windows全局消息,通过这个消息与其它进程通信
    end;

    ...
    procedure Form1.Button1Click1(Sender:TObject);
    var
        h:Cardinal;
    begin
        //通信的步骤得先找到要通信的信息窗口Handle
        h:=findWindow('目标进程窗口类名','窗口Caption'); 
        //发送消息消息类型为自定义的strWM
        SendMessage(h,strWM,0,0);  //这里同样可以带参数.wParam,lParam.但我传一个PChar,读取的时候总报错.不知道为啥
        
    end;
                     
2. 
    接收消息方:
        private 
            strWM:Cardinal;  //定义一个局部变量
            procedure wndProc(var msg:Tmessage);override; //覆盖这个方法,可以监听所有的Windows消息 回调函数    
         ...    
        proccedure Form1.Create(sender:TObject);
        begin
            strWM:= RegisterWindowMessage('newspopMessage'); //注册一个windows全局消息,这个相当于暗号
        end;
        procecure form1.wndProc(var msg:TMessage);
        begin
            //在这里处理这个消息就行了
            showmessage(strpas(PChar(mes.lparam))); //这样写会报错的.但可以处理其它无参数的事情
        end;


----------------------------------------------------------------------------------------------
二.第二种办法,发送一个WM_COPYDATA的消息.并且可以带一个TCopyDataStruct的结构类型参数.

 1. 
    发送消息方:
    

 

  procedure TMainForm.CallAgent(msg: string);
  var
    HlAgent:HWND;
    ds:TCopyDatastruct;    //定义一个TCopyDatastruct结构体变量
  begin
    AgentMsg := msg;
    ds.cbData := Length(msg)+1; //结构体的第一个元素: 长度cbData 
    GetMem(ds.lpData,ds.cbData); //分配内存,结构体的第二个参数:  数据的指针lpDATA
    StrCopy(ds.lpData,PChar(msg)); //复制值到结构指针

    HlAgent :=FindWindow('TmsgpopMainCaller','调用者');  //查找目标窗体的Handle
    if  HlAgent <> 0 then
    begin
      //ShowMessage('主' + IntToStr(Cardinal(@ds)));
      SendMessage(HlAgent,WM_COPYDATA,0,Cardinal(@ds));   //发送WM_COPYDATA消息,并带上参数 @ds
    end;
    FreeMem(ds.lpData); //释放数据内存
  end;

2.
    接收方程序:
    public 
            procedure MyMessage(var m:TWmCopyData);message WM_CopyData;   //定义一个消息响应过程,并传入一个TWmCopyData的参数
    ...
    procedure TmsgpopMainCaller.MyMessage(var m: TWmCopyData); //实现响应
    var
      msg:string;
    begin
      msg :=StrPas(m.CopyDataStruct^.lpData);    //获取参数数据
      ShowMessageForm := TShowMessageForm.Create(self,msg);  //处理
    end;


你可能感兴趣的:(windows,String,Delphi)