日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Delphi 两个应用程序(进程)之间的通信

發布時間:2024/10/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi 两个应用程序(进程)之间的通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

兩個應用程序之間的通信實際上是兩個進程之間的通信。由于本人知識有限,決定應用消息來實現。需要用到的知識:

1.RegisterWindowMessage(); //參數類型:pchar;返回值:LongInt;

2.FindWindow(
??? lpClassName,??????? {窗口的類名}
??? lpWindowName: PChar {窗口的標題}
): HWND;????????????? {返回窗口的句柄; 失敗返回 0}

3.Wndproc();//每個窗口會有一個稱為窗口過程的回調函數(WndProc),它帶有四個參數,分別為:窗口句柄(Window Handle),消息ID(Message ID),和兩個消息參數(wParam, lParam)

4.PostMessage(); //該函數將一個消息放入(寄送)到與指定窗口創建的線程相聯系消息隊列里,不等待線程處理消息就返回,是異步消息模式。消息隊列里的消息通過調用GetMessage和PeekMessage取得。取得后交由WndProc進行處理。

好了,需要的知識都在這里了,現在開始我們的應用程序之間通信。

首先在兩個應用程序的主窗體的創建過程注冊消息,消息編號一定要不小于WM_USer,然后在程序1中得到程序2的主窗體句柄,并通過PostMessage向其發送消息;接下來在程序2的主窗體創建過程注冊和程序1相同編號的消息,然后重載程序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,'接收消息窗口');? //發送消息方法一PostMessage(h1,strWM,0,0); end;procedure TForm1.BitBtn2Click(Sender: TObject); beginCallAgent(Edit1.Text);?? //發送消息方法二 end;procedure TForm1.CallAgent(msg: string); varHlAgent:HWND;ds:TCopyDatastruct;??? //定義一個TCopyDatastruct結構體變量 beginds.cbData := (Length(Msg)+1)*SizeOf(Char); //結構體的第一個元素: 長度cbDataGetMem(ds.lpData,ds.cbData); //分配內存,結構體的第二個參數:? 數據的指針lpDATAtryStrCopy(ds.lpData,PChar(Msg)); //復制值到結構指針HlAgent :=FindWindow('TForm2','接收消息窗口');? //查找目標窗體的Handleif? HlAgent <> 0 thenbegin//ShowMessage('主' + IntToStr(Cardinal(@ds)));SendMessage(HlAgent,WM_COPYDATA,0,Cardinal(@ds));?? //發送WM_COPYDATA消息,并帶上參數 @dsend;finallyFreeMem(ds.lpData); //釋放數據內存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;?? //定義一個消息響應過程,并傳入一個TWmCopyData的參數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);??? //獲取參數數據Edit1.Text := msg;? //顯示或者作其他處理 end;procedure TForm2.WndProc(var m: TMessage); beginif m.Msg = strWM thenEdit1.Text := Format('得到方式一發送的消息:%d',[m.Msg])elseinherited; end;end.

至此,應用程序間通信就完成了,這里需要注意:FindWindow一定要找到你想要得到消息的應用程序,也就是說如果用FindWindow(nil,'Form2'),你一定得保證窗體的caption:= Form2的程序是唯一的。

---------------------------------------------------------------------------------------------------------------------------------

另:delphi 進程間通信的兩種方法

WIN下面進程間通信的最常用辦法就是消息了.

下面記錄兩種消息通信的方式:
?--------------------------------------------------------------------------------------------
一.第一種辦法,利用注冊Windows全局的消息.并覆蓋wndProc過程來監聽消息處理.
1. 發送消息方:

privatestrWM:Cardinal; //定義一個局部變量... proccedure Form1.Create(sender:TObject);beginstrWM:= RegisterWindowMessage('newspopMessage'); //注冊一個windows全局消息,通過這個消息與其它進程通信end;...procedure Form1.Button1Click1(Sender:TObject);varh:Cardinal;begin//通信的步驟得先找到要通信的信息窗口Handleh:=findWindow('目標進程窗口類名','窗口Caption');//發送消息消息類型為自定義的strWMSendMessage(h,strWM,0,0); //這里同樣可以帶參數.wParam,lParam.但我傳一個PChar,讀取的時候總報錯.不知道為啥end;
2. 接收消息方:
privatestrWM:Cardinal; //定義一個局部變量procedure wndProc(var msg:Tmessage);override; //覆蓋這個方法,可以監聽所有的Windows消息回調函數 ... proccedure Form1.Create(sender:TObject);beginstrWM:= RegisterWindowMessage('newspopMessage'); //注冊一個windows全局消息,這個相當于暗號end;procecure form1.wndProc(var msg:TMessage);begin//在這里處理這個消息就行了showmessage(strpas(PChar(meg.lparam))); //這樣寫會報錯的.但可以處理其它無參數的事情end;
----------------------------------------------------------------------------------------------
二.第二種辦法,發送一個WM_COPYDATA的消息.并且可以帶一個TCopyDataStruct的結構類型參數.

?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,'接收消息窗口');? //發送消息方法一PostMessage(h1,strWM,0,0); end;procedure TForm1.BitBtn2Click(Sender: TObject); beginCallAgent(Edit1.Text);?? //發送消息方法二 end;procedure TForm1.CallAgent(msg: string); varHlAgent:HWND;ds:TCopyDatastruct;??? //定義一個TCopyDatastruct結構體變量 beginds.cbData := (Length(Msg)+1)*SizeOf(Char); //結構體的第一個元素: 長度cbDataGetMem(ds.lpData,ds.cbData); //分配內存,結構體的第二個參數:? 數據的指針lpDATAtryStrCopy(ds.lpData,PChar(Msg)); //復制值到結構指針HlAgent :=FindWindow('TForm2','接收消息窗口');? //查找目標窗體的Handleif? HlAgent <> 0 thenbegin//ShowMessage('主' + IntToStr(Cardinal(@ds)));SendMessage(HlAgent,WM_COPYDATA,0,Cardinal(@ds));?? //發送WM_COPYDATA消息,并帶上參數 @dsend;finallyFreeMem(ds.lpData); //釋放數據內存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;?? //定義一個消息響應過程,并傳入一個TWmCopyData的參數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);??? //獲取參數數據Edit1.Text := msg;? //顯示或者作其他處理 end;procedure TForm2.WndProc(var m: TMessage); beginif m.Msg = strWM thenEdit1.Text := Format('得到方式一發送的消息:%d',[m.Msg])elseinherited; end;end.

?

轉載于:https://www.cnblogs.com/xieyunc/p/9126532.html

總結

以上是生活随笔為你收集整理的Delphi 两个应用程序(进程)之间的通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 蜜臀久久99精品久久久画质超高清 | 欧美日韩xxxx | 九色精品 | 美女a视频 | 伊人久久久久久久久久久 | 五月天激情开心网 | 国产视频一区二区三区在线播放 | 久久精品美女 | av每日更新在线观看 | 色婷婷av一区二区三区之e本道 | 久久久久亚洲AV成人无在 | 福利91| 美女黄色一级片 | 青青草免费在线观看视频 | 丝袜美腿一区二区三区 | 日韩日韩 | 奇米一区二区 | 久久午夜一区 | 日狠狠| 懂色av中文字幕 | 国产98在线 | 99热麻豆| 国产资源在线看 | 久久高清免费 | 欧美日本一二三区 | 亚洲美女久久久 | 你懂的国产视频 | 西比尔在线观看完整视频高清 | 国产老头老太作爱视频 | 片黄在线观看 | 肉大捧一进一出免费视频 | 97色在线| 婷婷黄色网| 国产美女主播 | 国产精品一区二区在线播放 | 大桥未久av在线播放 | 成人免费高清视频 | 亚洲精品乱码久久久久久蜜桃麻豆 | 91九色网站 | 懂色av懂色av粉嫩av分享吧 | 欧美日韩一区二区不卡 | 牛牛精品一区 | 日韩欧美国产综合 | 日本亚洲一区二区三区 | 天天舔天天操天天干 | 精品九九视频 | 红桃视频一区 | 欧美日韩在线免费视频 | 精品播放 | 可以看毛片的网站 | 天堂成人在线 | 欧美影院一区二区三区 | 日韩美一区二区 | 欧美视频一二三 | 日韩av女优在线观看 | 国产这里有精品 | 亚洲综合情 | 国产一区麻豆 | 久久99国产精品久久99 | 中文字幕亚洲精品在线观看 | 6699嫩草久久久精品影院 | 黄色网战入口 | 一区二区三区在线观看 | 4438五月天| 精品人妻伦一二三区久久 | 国产精品夜夜夜爽阿娇 | 成人精品视频在线播放 | 韩国视频一区二区 | 亚洲色成人www永久在线观看 | 成人免费一区二区 | 高跟鞋肉丝交足91 | 日韩在线看片 | 欧美一区二区三区免费在线观看 | 色婷婷亚洲一区二区三区 | 免费国产小视频 | 日日夜精品 | 欧美影院在线观看 | 波多野结衣视频一区二区 | 久草青青草| 农民人伦一区二区三区 | 久久av影院 | xx视频在线观看 | 日干夜干天天干 | 成人免费片 | 日韩精品小视频 | 国产午夜免费视频 | 久久久久亚洲AV | 色综合中文字幕 | 亚洲高清在线 | 国产欧美一区二区三区在线看蜜臂 | 草草地址线路①屁屁影院成人 | 国产视频网站在线观看 | 日本一区二区免费在线观看 | 午夜在线不卡 | 97久久人国产精品婷婷 | 国产chinese中国hdxxxx| 午夜激情在线 | 不卡影院一区二区 | 精品国产一区二区三区四 |