Delphi Tips 
-----------------------------

0268  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/09/19 K.Takaoka rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/19 K.Takaoka 編集
簡易アプリケーション間通信

Win32 環境で 2 つのアプリケーションがお互いに通信する方法は非常に多くあります.
同じコンピュータ上の 2 つのフォーム(ウィンドウ)の間で簡単に通信を行うには WM_COPYDATA というメッセージを使うという方法があります.
これは、2 つのフォームが同じアプリケーションであっても違うアプリケーションであっても問題ありません.

WM_COPYDATA を利用するには, 相手の WindowHandle が分かっている必要があります. Form1 の WindowHandle は Form1.Handle で取得できます.
画面内にあるフォーム(ウィンドウ)の検索は FindWindow API を用いて行うことができます.
ここでは相手の WindowHandle の得方については言及しません.

受信側では TForm1 のインターフェス部にメッセージハンドラを追加します. private でかまわないでしょう.

  private
    procedure WMCopyData(var msg: TWMCopyData);
      message WM_COPYDATA;


送信側では、CopyDataStruct 構造体に送信するデータを格納してから、WM_COPYDATA を送信します.


procedure TForm1.Button1Click(Sender: TObject);
var
  buf: PChar;
  i: Integer;
  cd: TCopyDataStruct;
begin
  cd.dwData := SIGNATURE_STRING;
  cd.cbData := Length(Memo1.Lines.Text)+1;
  cd.lpData := StrAlloc(cd.cbData);
  try
    StrCopy(cd.lpData, PChar(Memo1.Lines.Text));
    SendMessage(Handle, WM_COPYDATA, WPARAM(Handle), LPARAM(@cd));
  finally
    StrDispose(cd.lpData);
  end;
end;


この例では, Memo1 の内容を自分自身に送信しています.
このメッセージの受信側実装は


procedure TForm1.WMCopyData(var msg: TWMCopyData);
var
  i: Integer;
  buf: PChar;
begin
  if msg.CopyDataStruct.dwData=SIGNATURE_STRING then
  begin
    buf := StrALloc(msg.CopyDataStruct.cbData);
    try
      StrCopy(buf, msg.CopyDataStruct.lpData);
      Memo2.Lines.Text := buf;
    finally
      StrDispose(buf);
    end;
  end
  else
    inherited;
end;


このような感じになります. この例では受信した文字列を Memo2 に設定しています.
受信した CopyDataStruct の内容は読み出し専用になっていますので注意してください.

双方で使われている SIGNATURE_STRING は適当な DWORD 値を指定します.たとえば

  cosnt SIGNATURE_STRING: DWORD = $00000001;

のような値でも良いでしょう, 重要なのは送信側と受信側で同じ値を使うことです.

CopyDataStruct には 3 つの要素 dwData と cbData と lpData があります.
lpData に目的のデータを格納し cbData には lpData に保持されたデータのバイト数を格納します.
dwData は独立して利用できますが, 一般的には lpData の内容を示すユニークな値を格納しておきます.
参照: [Delphi-ML:4527] [Tips:90] <通信>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp