使用 DELPHI 与 Windows 上的两个应用程序通信
Posted
技术标签:
【中文标题】使用 DELPHI 与 Windows 上的两个应用程序通信【英文标题】:Communication with two application on Windows with DELPHI 【发布时间】:2014-04-09 13:54:31 【问题描述】:我有两个应用程序,并希望两个应用程序在发布异常时发送短信。
问题如下: 在应用程序中,我使用该功能
Application.Handle
获取应用程序的句柄。
在我的客户中我使用:
ServerApplicationHandle: = FindWindow ('TForm1', 'Form1');
要知道我应该向哪个应用程序发送消息,但两者都返回不同的数字,他们会知道告诉我原因吗?
【问题讨论】:
pipes 通常是两个或多个应用程序之间通信的方式。 查看Inter-process communication使用管道进行通信。 内存映射文件也非常快,并且可以在应用程序之间工作(在同一台计算机上) @mjn 内存映射肯定不是要走的路。你如何表示有新消息?你如何同步? 【参考方案1】:正如已经解释的(主要)表单和应用程序是两个不同的东西。 自 Delphi 2007 以来,还有另一种行为需要注意。 依赖于 Application.MainformOnTaskbar,您可以(或不)通过 Findwindow 获取句柄。
显示不同行为的小片段
var
FW_ah, FW_mfh, ah, mfh: THandle;
Procedure Display(OnTask: Boolean);
begin
Application.MainFormOnTaskbar := OnTask;
ah := Application.Handle;
mfh := MainForm.Handle;
FW_ah := FindWindow(PChar(Application.ClassName), PChar(Application.Title));
FW_mfh := FindWindow(PChar(ClassName), PChar(Caption));
Showmessage(Format('ah: %d FW_ah: %d - mfh: %d FW_mfh: %d', [ah, FW_ah, mfh, FW_mfh]));
end;
begin
Display(true);
Display(false);
end;
【讨论】:
【参考方案2】:Application.Handle
是与全局 Application
对象关联的隐藏窗口的窗口句柄。
FindWindow('TForm1', 'Form1')
将返回您应用程序中***表单的窗口句柄。
这些确实不是一回事。我想你可以使用Form1.Handle
而不是Application.Handle
。但是,您需要小心重新创建窗口。
坦率地说,这听起来并不是进行进程间通信的最佳方式。也许您可以考虑使用套接字或命名管道。
【讨论】:
谢谢你的建议,你有例子吗?我会研究替代方案。 周围有很多例子。我想我回答了你问的问题。以上是关于使用 DELPHI 与 Windows 上的两个应用程序通信的主要内容,如果未能解决你的问题,请参考以下文章
Delphi Tokyo 10.2 Windows 7上的TDSRestConnection DataSnap连接