Delphi 两个应用程序(进程)之间的通信
兩個(gè)應(yīng)用程序之間的通信實(shí)際上是兩個(gè)進(jìn)程之間的通信。由于本人知識(shí)有限,決定應(yīng)用消息來實(shí)現(xiàn)。需要用到的知識(shí):
1.RegisterWindowMessage(); //參數(shù)類型:pchar;返回值:LongInt;
2.FindWindow(
??? lpClassName,??????? {窗口的類名}
??? lpWindowName: PChar {窗口的標(biāo)題}
): HWND;????????????? {返回窗口的句柄; 失敗返回 0}
3.Wndproc();//每個(gè)窗口會(huì)有一個(gè)稱為窗口過程的回調(diào)函數(shù)(WndProc),它帶有四個(gè)參數(shù),分別為:窗口句柄(Window Handle),消息ID(Message ID),和兩個(gè)消息參數(shù)(wParam, lParam)
4.PostMessage(); //該函數(shù)將一個(gè)消息放入(寄送)到與指定窗口創(chuàng)建的線程相聯(lián)系消息隊(duì)列里,不等待線程處理消息就返回,是異步消息模式。消息隊(duì)列里的消息通過調(diào)用GetMessage和PeekMessage取得。取得后交由WndProc進(jìn)行處理。
好了,需要的知識(shí)都在這里了,現(xiàn)在開始我們的應(yīng)用程序之間通信。
首先在兩個(gè)應(yīng)用程序的主窗體的創(chuàng)建過程注冊(cè)消息,消息編號(hào)一定要不小于WM_USer,然后在程序1中得到程序2的主窗體句柄,并通過PostMessage向其發(fā)送消息;接下來在程序2的主窗體創(chuàng)建過程注冊(cè)和程序1相同編號(hào)的消息,然后重載程序2的Wndproc過程。廢話就不多說了,直接貼代碼:
程序1//
unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons;typeTForm1 = class(TForm)BitBtn1: TBitBtn;BitBtn2: TBitBtn;Edit1: TEdit;procedure FormShow(Sender: TObject);procedure BitBtn1Click(Sender: TObject);procedure BitBtn2Click(Sender: TObject);private{ Private declarations }strWM:Cardinal;procedure CallAgent(msg:string);public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject); varh1: HWND; beginh1:= FindWindow(nil,'接收消息窗口');? //發(fā)送消息方法一PostMessage(h1,strWM,0,0); end;procedure TForm1.BitBtn2Click(Sender: TObject); beginCallAgent(Edit1.Text);?? //發(fā)送消息方法二 end;procedure TForm1.CallAgent(msg: string); varHlAgent:HWND;ds:TCopyDatastruct;??? //定義一個(gè)TCopyDatastruct結(jié)構(gòu)體變量 beginds.cbData := (Length(Msg)+1)*SizeOf(Char); //結(jié)構(gòu)體的第一個(gè)元素: 長(zhǎng)度cbDataGetMem(ds.lpData,ds.cbData); //分配內(nèi)存,結(jié)構(gòu)體的第二個(gè)參數(shù):? 數(shù)據(jù)的指針lpDATAtryStrCopy(ds.lpData,PChar(Msg)); //復(fù)制值到結(jié)構(gòu)指針HlAgent :=FindWindow('TForm2','接收消息窗口');? //查找目標(biāo)窗體的Handleif? HlAgent <> 0 thenbegin//ShowMessage('主' + IntToStr(Cardinal(@ds)));SendMessage(HlAgent,WM_COPYDATA,0,Cardinal(@ds));?? //發(fā)送WM_COPYDATA消息,并帶上參數(shù) @dsend;finallyFreeMem(ds.lpData); //釋放數(shù)據(jù)內(nèi)存end; end;procedure TForm1.FormShow(Sender: TObject); beginstrWM:= RegisterWindowMessage('UserDefMessage'); end;end. 程序2/unit Unit2;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;//const //? My_MousL = WM_USER+100; typeTForm2 = class(TForm)Edit1: TEdit;Label1: TLabel;procedure FormShow(Sender: TObject);private{ Private declarations }strWM:Cardinal;public{ Public declarations }procedure WndProc(var m:TMessage);override;procedure MyMessage(var m:TWmCopyData);message WM_CopyData;?? //定義一個(gè)消息響應(yīng)過程,并傳入一個(gè)TWmCopyData的參數(shù)end;varForm2: TForm2;implementation{$R *.dfm}{ TForm2 }procedure TForm2.FormShow(Sender: TObject); beginstrWM := RegisterWindowMessage('UserDefMessage'); end;procedure TForm2.MyMessage(var m: TWmCopyData); varmsg:String;pStr:PChar; beginpStr := m.CopyDataStruct^.lpData;msg := system.SysUtils.StrPas(pStr);??? //獲取參數(shù)數(shù)據(jù)Edit1.Text := msg;? //顯示或者作其他處理 end;procedure TForm2.WndProc(var m: TMessage); beginif m.Msg = strWM thenEdit1.Text := Format('得到方式一發(fā)送的消息:%d',[m.Msg])elseinherited; end;end.至此,應(yīng)用程序間通信就完成了,這里需要注意:FindWindow一定要找到你想要得到消息的應(yīng)用程序,也就是說如果用FindWindow(nil,'Form2'),你一定得保證窗體的caption:= Form2的程序是唯一的。
---------------------------------------------------------------------------------------------------------------------------------
另:delphi 進(jìn)程間通信的兩種方法
WIN下面進(jìn)程間通信的最常用辦法就是消息了.
下面記錄兩種消息通信的方式:
?--------------------------------------------------------------------------------------------
一.第一種辦法,利用注冊(cè)Windows全局的消息.并覆蓋wndProc過程來監(jiān)聽消息處理.
1. 發(fā)送消息方:
2. 接收消息方:
privatestrWM:Cardinal; //定義一個(gè)局部變量procedure wndProc(var msg:Tmessage);override; //覆蓋這個(gè)方法,可以監(jiān)聽所有的Windows消息回調(diào)函數(shù) ... proccedure Form1.Create(sender:TObject);beginstrWM:= RegisterWindowMessage('newspopMessage'); //注冊(cè)一個(gè)windows全局消息,這個(gè)相當(dāng)于暗號(hào)end;procecure form1.wndProc(var msg:TMessage);begin//在這里處理這個(gè)消息就行了showmessage(strpas(PChar(meg.lparam))); //這樣寫會(huì)報(bào)錯(cuò)的.但可以處理其它無參數(shù)的事情end;
----------------------------------------------------------------------------------------------
二.第二種辦法,發(fā)送一個(gè)WM_COPYDATA的消息.并且可以帶一個(gè)TCopyDataStruct的結(jié)構(gòu)類型參數(shù).
?1. 發(fā)送消息方:
2.接收方程序:
unit Unit2;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;//const //? My_MousL = WM_USER+100; typeTForm2 = class(TForm)Edit1: TEdit;Label1: TLabel;procedure FormShow(Sender: TObject);private{ Private declarations }strWM:Cardinal;public{ Public declarations }procedure WndProc(var m:TMessage);override;procedure MyMessage(var m:TWmCopyData);message WM_CopyData;?? //定義一個(gè)消息響應(yīng)過程,并傳入一個(gè)TWmCopyData的參數(shù)end;varForm2: TForm2;implementation{$R *.dfm}{ TForm2 }procedure TForm2.FormShow(Sender: TObject); beginstrWM := RegisterWindowMessage('UserDefMessage'); end;procedure TForm2.MyMessage(var m: TWmCopyData); varmsg:String;pStr:PChar; beginpStr := m.CopyDataStruct^.lpData;msg := system.SysUtils.StrPas(pStr);??? //獲取參數(shù)數(shù)據(jù)Edit1.Text := msg;? //顯示或者作其他處理 end;procedure TForm2.WndProc(var m: TMessage); beginif m.Msg = strWM thenEdit1.Text := Format('得到方式一發(fā)送的消息:%d',[m.Msg])elseinherited; end;end.
?
轉(zhuǎn)載于:https://www.cnblogs.com/xieyunc/p/9126532.html
總結(jié)
以上是生活随笔為你收集整理的Delphi 两个应用程序(进程)之间的通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广发临时额度要不要调
- 下一篇: 兴业银行股票为啥跌 具体原因解析