2

重複の可能性:
プロセス間通信

Delphi を使用して、互いに通信して対話する 2 つの単純なプログラムを作成する可能性はありますか。たとえば、最初のボタンをクリックすると、もう 1 つのボタンにメッセージが表示されます。

出来ますか?

4

2 に答える 2

3

IPCには多くの可能性があります

  • ウィンドウ メッセージの送信
  • 名前付きパイプの使用
  • TCP-IP / UDP を使用
  • 共有メモリ

等々 ...

最も簡単な方法は、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.

2 番目のプロジェクト:

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を使用できます

于 2012-12-25T09:20:12.677 に答える
1

さまざまなシステムやその他の高度な要件で実行されるアプリケーションには、Microsoft Message Queuing (MSMQ) などのメッセージング ソリューションや、オープン ソース システムの Apache ActiveMQ、HornetQ、RabbitMQなどのクロスプラットフォーム メッセージ ブローカー ベースのソリューションもあります。

これらのメッセージング システムを使用すると、受信者が現在リッスンしていない場合でも機能する、信頼性の高いピア ツー ピア通信を簡単に実装できます。

利用可能な Delphi / Free Pascal クライアント ライブラリ、商用およびオープン ソースがあります。

于 2012-12-25T11:27:01.143 に答える