使用 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连接

Delphi中服务与可执行文件的关系

Windows 7 x64上的Delphi问题?

delphi的安装方法

Windows 7 的任务栏上的 Delphi 表单图标模糊(启用 MainFormOnTaskbar)

Delphi 在 Windows 7 64 上使用 LockFile