可能重复:
进程间通信
使用 Delphi,我是否有可能构建两个相互通信和交互的简单程序,比如说通过单击第一个中的一个按钮,另一个显示一条消息。
是否可以?
IPC有很多可能性
等等 ...
最简单的方法是将消息发送到 FindWindow Named Pipes 找到的窗口句柄,并且 TCP-IP 应该优先用于广泛的通信。
微演示:
第一个项目:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TTMiniDemoSender = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
TMiniDemoSender: TTMiniDemoSender;
implementation
{$R *.dfm}
Const
C_MyMessage=WM_USER + 1234;
procedure TTMiniDemoSender.Button1Click(Sender: TObject);
var
wnd:HWND;
begin
wnd := FindWindow('TTMiniDemoReceiver',nil);
if wnd<>0 then SendMessage(wnd,C_MyMessage,123,456);
end;
end.
第二个项目:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
Const
C_MyMessage=WM_USER + 1234;
type
TTMiniDemoReceiver = class(TForm)
private
{ Private-Deklarationen }
Procedure MyMessage(var MSG:TMessage); message C_MyMessage;
public
{ Public-Deklarationen }
end;
var
TMiniDemoReceiver: TTMiniDemoReceiver;
implementation
{$R *.dfm}
{ TTMiniDemoReceiver }
procedure TTMiniDemoReceiver.MyMessage(var MSG: TMessage);
begin
Showmessage(IntToStr(MSG.WParam) + '-' + IntToStr(MSG.LParam) );
msg.Result := -1;
end;
end.
要传输更多信息,您可以使用WM_CopyData
对于在不同系统上运行的应用程序和其他高级需求,还有消息解决方案,如Microsoft 消息队列(MSMQ) 或基于跨平台消息代理的解决方案,如开源系统 Apache ActiveMQ、HornetQ 和 RabbitMQ。
使用这些消息传递系统,很容易实现可靠的点对点通信,即使接收者当前没有收听也可以工作。
有可用的 Delphi / Free Pascal 客户端库,商业和开源。