DDEの使い方
DDEはDynamic Data Exchangeの略でWindowsが提供するプロセス間通信の一つです。DDEはクリップボードに似ていますが、特定のプロセスどうしでデータのやり取りができます。これに対してクリップボードは非特定のプロセス間で共有されます。DDEはOLEとも似ていますが、OLEの場合はコンテナ(データを表示する側)はデータがどのようなものかを意識しなくてもよいようになっていますが、DDEはサーバとクライアントともデータを意識する必要があります。
MicrosoftはDDEよりもOLEを使うほうがよいと言っていますが、DDEのほうがスピードの点では速いようなのでケースバイケースで使い分けてもいいと思われます。
OLEは各種のデータを扱うことができますが、DDEはふつう文字列を扱うことが多いようです(クラシッククリップボードも同じです)。文字列のほか、ビットマップも扱うことができるようです。
DDE特有の用語
DDEではつぎの用語が使われます。
用語 | 意味 |
DDEサービス | サーバアプリケーションファイル名の拡張子を除いたもの。 |
DDEトピック | サーバが認識可能なデータの単位。 |
DDEアイテム(項目) | 実際にデータ転送するデータ項目 |
サーバ | サービスを行うアプリケーションのこと。 |
クライアント | サービスを受けるアプリケーションのこと。 |
DDEクライアントアプリケーションの例
サンプルクライアントの外観
プログラム
unit frmClient; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DdeMan, StdCtrls, ExtCtrls; type TForm1 = class(TForm) DdeClientConv1: TDdeClientConv; DdeClientItem1: TDdeClientItem; Edit1: TEdit; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure DdeClientItem1Change(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var p: PChar; str: String; begin p := DdeClientConv1.RequestData('DdeServerItem1'); str := StrPas(p); Edit1.Text := str; StrDispose(p); end; procedure TForm1.DdeClientItem1Change(Sender: TObject); begin Edit1.Text := DdeClientItem1.Text; end; procedure TForm1.Button2Click(Sender: TObject); var s: array[0..255] of char; begin StrPCopy(s, Edit1.Text); DdeClientConv1.PokeData('DdeServerItem1', s) end; procedure TForm1.FormCreate(Sender: TObject); begin DdeClientConv1.SetLink('DDESvr', 'DdeServerConv1'); end; end.
DDEサーバアプリケーションの例
サンプルサーバの外観
unit frmDDE; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DdeMan, StdCtrls; type TfrmServer = class(TForm) DdeServerConv1: TDdeServerConv; DdeServerItem1: TDdeServerItem; Edit1: TEdit; Label1: TLabel; Button1: TButton; Button2: TButton; procedure DdeServerItem1Change(Sender: TObject); procedure DdeServerConv1Open(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var frmServer: TfrmServer; implementation {$R *.DFM} procedure TfrmServer.DdeServerItem1Change(Sender: TObject); begin Edit1.Text := DdeServerItem1.Text; end; procedure TfrmServer.DdeServerConv1Open(Sender: TObject); begin Label1.Caption := 'Link open'; end; procedure TfrmServer.Button1Click(Sender: TObject); begin DdeServerItem1.Text := Edit1.Text; DdeServerItem1.CopyToClipboard; end; procedure TfrmServer.Button2Click(Sender: TObject); begin Edit1.Text := ''; end; end.