delphi.gif (306 バイト) DDEの使い方


DDEはDynamic Data Exchangeの略でWindowsが提供するプロセス間通信の一つです。DDEはクリップボードに似ていますが、特定のプロセスどうしでデータのやり取りができます。これに対してクリップボードは非特定のプロセス間で共有されます。DDEはOLEとも似ていますが、OLEの場合はコンテナ(データを表示する側)はデータがどのようなものかを意識しなくてもよいようになっていますが、DDEはサーバとクライアントともデータを意識する必要があります。

MicrosoftはDDEよりもOLEを使うほうがよいと言っていますが、DDEのほうがスピードの点では速いようなのでケースバイケースで使い分けてもいいと思われます。

OLEは各種のデータを扱うことができますが、DDEはふつう文字列を扱うことが多いようです(クラシッククリップボードも同じです)。文字列のほか、ビットマップも扱うことができるようです。

-

toach.gif (917 バイト) DDE特有の用語

DDEではつぎの用語が使われます。

用語

意味

DDEサービス サーバアプリケーションファイル名の拡張子を除いたもの。
DDEトピック サーバが認識可能なデータの単位。
DDEアイテム(項目) 実際にデータ転送するデータ項目
サーバ サービスを行うアプリケーションのこと。
クライアント サービスを受けるアプリケーションのこと。

 

-

toach.gif (917 バイト) DDEクライアントアプリケーションの例

  1. コンポーネントパレットのSystemタブからDdeClientConvとDdeClientItemを選んでフォームに貼り付けます。
  2. DdeClientConvのConnectModeをddeAutomaticにします。
  3. DdeServiceとDdeTopicはプログラムの中で指定するので空欄にしておきます。
  4. ServiceApplicationを設定します(ここではDDESvr.exeとします)
  5. DdeClientItemのDdeConvを貼り付けたDdeClientConvの名前(ここではDdeClientConv1)にします。
  6. DdeItemはプログラムの中で指定するので空欄にしておきます。
  7. オブジェクトインスペクタのイベントタブでDdeClientItemのOnChangeイベントハンドラを追加します。

 

toach.gif (917 バイト) サンプルクライアントの外観

DDEClient.jpg (9436 バイト)

 

delphi1.gif (322 バイト) プログラム

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.

 

-

toach.gif (917 バイト) DDEサーバアプリケーションの例

  1. コンポーネントパレットのSystemタブからDdeServerConvとDdeServerItemを選んでフォームに貼り付けます。
  2. DdeServerItemのServerConvを貼り付けたDdeServerConvの名前にします。
  3. イベントタブにしてOnChangeイベントハンドラを追加します。
  4. DdeServerConvのイベントタブでOnOpenイベントハンドラを追加します。

 

toach.gif (917 バイト) サンプルサーバの外観

 

delphi1.gif (322 バイト)

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.