程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi 進程間通信

Delphi 進程間通信

編輯: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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved