delphi 處理序間通訊的兩種方法

來源:互聯網
上載者:User

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;


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.