簡易アプリケーション間通信
|
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 の内容を示すユニークな値を格納しておきます. |
|