嘰哩咕嚕

          君子如玉,上善若水

          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;
           













          posted on 2010-08-31 14:31 嘰哩咕嚕 閱讀(4063) 評論(0)  編輯  收藏 所屬分類: delphi


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          公告

          瘋狂

          導航

          <2010年8月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          統計

          常用鏈接

          留言簿

          隨筆分類(17)

          隨筆檔案(22)

          文章分類(1)

          文章檔案(1)

          工程教程

          牛人BLOG

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 玛多县| 荃湾区| 炎陵县| 天祝| 江口县| 白朗县| 抚顺县| 永寿县| 阜宁县| 淅川县| 乐至县| 石景山区| 昌乐县| 兴宁市| 梓潼县| 镇坪县| 淳安县| 娄烦县| 藁城市| 亚东县| 凌海市| 留坝县| 桂阳县| 定陶县| 介休市| 分宜县| 梨树县| 共和县| 邹城市| 平陆县| 比如县| 辛集市| 蒙阴县| 镇巴县| 阿克陶县| 大城县| 永安市| 紫金县| 榕江县| 台湾省| 会东县|