バージョン 6.3.3
 —  プログラミングガイド  —

ダイナミックデータ交換 - DDE

このドキュメントでは、次のトピックについて説明します。


概念

DDE は、異なるアプリケーション間でデータを交換できるようにするために Microsoft によって定義されているプロトコルです。 つまり、例えば Natural で作成されたアプリケーションとスプレッドシートの両方が DDE プロトコルを処理できるため、両者間でデータを交換できます。 DDE プロトコルを処理するアプリケーションは、標準化されたメッセージを使用して別の DDE アプリケーションと通信します。 一方のアプリケーションはクライアントとして定義され、他方はサーバーとして定義されます。 クライアントおよびサーバーは DDE 会話を保ちます。

注意:
DDE の概念および用語に関する説明については、Microsoft Windows のドキュメントを参照してください。

DDE 会話のデータは、以下の 3 レベルの階層によって識別されます。

DDE 会話は、クライアントが DDE サーバーにサービスを要求したときに確立されます。 1 つの DDE サーバーはすべてのアクティブなアプリケーションに 1 つまたは複数のサービスを提供します。

DDE サーバーは、各サービスに対してトピックをいくつでも提供できます。 DDE クライアントは、サービストピックに対して会話を要求します。

サービストピック上の会話で、DDE クライアントおよび DDE サーバーは交換されるデータを項目名によって一意に識別します。

DDE サーバーは、多くのトピックを含むことのできる多くのサービスをサポートします。さらに、トピックも多くの項目を含むことができます。

Natural を使用すると、DDE クライアントアプリケーションと DDE サーバーアプリケーションの両方を開発できます。 例えば、DDE サーバーとして機能するスプレッドシートにデータを要求する Natural DDE クライアントアプリケーションを作成することも、ワードプロセッサ(DDE クライアント)にデータを提供する Natural DDE サーバーアプリケーションを作成することもできます。

DDE クライアントアプリケーションおよび DDE サーバーアプリケーションを開発するために、以下の機能が提供されています。

DDE サーバーアプリケーションを開発するには、DDE-SERVER イベントに応答し、SYSTEM ライブラリ内の接頭語 NGU-SERVER で始まるサブプログラムを使用してサービスおよびトピックの登録と DDE クライアントアプリケーションへのメッセージとデータの送信を行います。

DDE クライアントアプリケーションを開発するには、DDE-CLIENT イベントに応答し、SYSTEM ライブラリ内の接頭語 NGU-CLIENT で始まるサブプログラムを使用して会話の初期化と DDE サーバーアプリケーションへの要求およびその他の DDE コマンドの送信を行います。

常に、クライアントダイアログまたはサーバーダイアログにパラメータデータエリア NGULDDE1 とローカルデータエリア NGULFCT1 を含める必要があります (SYSTEM ライブラリ内の接頭語 NGU- で始まるサブプログラムを使用するために NGULFCT1 が必要です)。

Top of page

DDE サーバーアプリケーションの開発

以下では次のトピックについて説明します。

サービスおよびトピックの登録/登録解除

DDE サーバーアプリケーションを DDE クライアントアプリケーションから指定できるようにするには、DDE サーバーアプリケーションのサービス名とサービスでサポートされるすべてのトピックを登録する必要があります。 サブプログラム NGU-SERVER-REGISTER を使用して、DDE サーバーがサポートするサービス/トピックごとに登録を行います。 登録は、通常、基本ダイアログの "AFTER OPEN" イベントで処理されます。

サービス/トピックを初めて登録するときは、サーバーとして機能してクライアントからすべての DDE メッセージを受け取るダイアログのダイアログ ID を、Natural に提供します。 これは、DDE-VIEW.CONV-ID にダイアログ ID を設定し、DDE-VIEW.MESSAGE にも文字列 "DLGID" を設定することによって行います。

後でサービスにトピックを追加したり、完全に新しいサービスを追加したりすることもできます。 サブプログラム NGU-SERVER-UNREGISTER を使用してトピックを登録解除することもできます。

クライアントからのデータの取得

サービスおよびトピックを正常に登録できたら、DDE サーバーアプリケーションは、サービスの登録されたトピック上で会話を確立している DDE クライアントアプリケーションから DDE メッセージを受け取ることができます。

この DDE サーバーへのメッセージは、ダイアログの DDE-SERVER イベントで受信されます。 イベントハンドラセクションの初めに、 サブプログラム NGU-SERVER-GET-DATA を使用して DDE-VIEW にクライアントのメッセージデータを格納する必要があります。 データを読み終えたら、受け取ったクライアントメッセージに基づいて行動する必要があります。 有効なメッセージとその意味が、サブプログラム NGU-SERVER-GET-DATA の記述で説明されています。

クライアントへのデータの送信

クライアントメッセージは最終的にはサーバーがクライアントにデータを送ることを要求します。 クライアントへのデータ送信は、サブプログラム NGU-SERVER-DATA を使用して行われます。

DDE サーバー操作の終了

DDE サーバー操作を終了する場合は、常にサブプログラム NGU-SERVER-STOP を使用します。 これは、すべてのサービスを登録解除して、すべての確立された会話を終了します。 そして、CLOSE DIALOG ステートメントでサーバーアプリケーションを終了します。

Top of page

DDE クライアントアプリケーションの開発

以下では次のトピックについて説明します。

DDE サーバーアプリケーションとの接続

DDE クライアントアプリケーションは、DDE サーバーアプリケーションとの会話を確立するために、接続するサーバーのサービス名およびトピック名を指定してサブプログラム NGU-CLIENT-CONNECT を呼び出す必要があります。 サーバーから適切な DDE イベントを受け取るために、DDE-VIEW.CONV-ID にクライアントのダイアログ ID を設定し、DDE-VIEW.MESSAGE にも文字列 "DLGID" を設定する必要があります。 サブルーチンは一意な会話 ID を DDE-VIEW.CONV-ID に返します。 サーバーとの今後のすべての通信にこの値を使用する必要があります。

DDE サーバーアプリケーションのサービスの使用

会話が確立すると、サーバーのサービスを使用するためのいくつかのオプションがクライアントに提供されます。 以下の処理を実行できます。

DDE サーバーアプリケーションからのデータの受信

DDE クライアントは、DDE サーバーからのデータまたはその他のメッセージをクライアントダイアログの DDE-CLIENT イベントを通して受け取ります。 サーバーがメッセージを送信すると、常にこのイベントが発生します。 まず NGU-CLIENT-GET-DATA を使用してこのメッセージの内容を取り出す必要があります。 こうすることによって、DDE-VIEW 構造に適切に格納されます。 クライアントは、どのメッセージ(DDE-VIEW.MESSAGE)が届いたかを識別して、適切に応答する必要があります。 有効なメッセージが、サブプログラム NGU-CLIENT-GET-DATA の記述にリストされています。

DDE サーバーアプリケーションからの切断

クライアントがこれ以上は会話が必要ないと判断したら、NGU-CLIENT-DISCONNECT を呼び出してサーバーに会話を終了するように通知する必要があります。

DDE クライアント操作の終了

クライアントアプリケーションが終了するか、または DDE の使用を停止するときは、常に NGU-CLIENT-STOP を呼び出す必要があります。 これにより、Natural にクライアントのすべてのアクティブな会話を終了してアプリケーションの DDE 操作を停止するように通知します。

Top of page

リターンコード

このセクションでは、リターンコードについて説明します。

注意:
エラーコードの説明が完全でないものがあります。 この場合はアスタリスク(*)を付記してあります。

コード 意味
-1 無効なコマンドまたはコマンドパラメータが指定されました。 DDE データエリアが正しいタイプで、コマンドが正しいことを確認してください。
0 関数が正しく処理されました。
1 アプリケーションが DDEML ライブラリを 2 回以上初期化しようとしたときに、この値が返されます。 プログラムのロジックを確認してください。 プログラムの最後の実行中に DDEML が正しく終了したことも確認してください。
2 前に DDEML を正しく終了しないでプログラムを実行した場合に、この値がサーバーの初期化関数から返されます。 要求されたサービスが異常終了した場合も、常にこの値がコールバック関数によって返されます。
  基本となるレイヤでエラーが発生しました。 *
3 参照された会話 ID を持つアクティブな会話がありません。 正しいサービス名を指定したかどうかを確認してください。
4 最大インスタンス数が接続されているため、アプリケーションが DDE ライブラリを初期化できませんでした。
5 DDEML 通信が初期化されていません。 DDE 処理を行うには、先に DDEML を初期化する必要があります。
6 メモリの割り当てに問題が発生しました。 会話のどちら側かのメッセージキューが長くなり過ぎた場合に、このエラーが発生します。 *
7 サービス、トピック、または項目の名前が 255 文字を超えました。 フィールドが DDE-VIEW を正しく指定しているかどうかを確認して、これらの変数のいずれも 255 文字を超える文字列を含まないことを確実にしてください。
8 DDE ライブラリでエラーが発生しました。 Software AG サポートに連絡してください。 *
9 これは関数呼び出しによって返されます。 関数に渡されたパラメータが無効です。 パラメータを確認してください。
10 "Server Type Link" がサポートされますが、UNLINK に対するコールバック関数は関数 PIDsRegisterTopic に渡されません。 *
11 少なくとも 1 つの会話がアクティブであるトピックを削除しようとしました。 これは、会話がまだ存続しているトピックを登録解除しようとした場合も含みます。
12 参照されているサービス/トピックが関数 PIDsRegisterTopic に登録されていません。
13 NGU-SERVER-DATA サブプログラムが使用されたときに DDE-VIEW.SERVICE へのリンクがアクティブではありませんでした。 サービス名を調べ、SDK ツールキット内の DDE-SPY を使用して使用可能なサービスを確認してください。
14 要求されたリンクタイプが無効です。
15 トランザクション ID が不正です。 DDE ビューでトランザクション ID 値を確認してください。
16 クライアントアプリケーションが会話を要求しましたが、その前に、リンクに対してデータを送信するための関数が指定されませんでした。
17 非同期トランザクションが要求されましたが、クライアントアプリケーションは完了したトランザクションの詳細を送信するための関数を指定しませんでした。 会話の初期化時にこの関数を指定する必要があります。
18 同期トランザクションでタイムアウトが発生しました。 トランザクションが完了するのにかかる時間が、DDE-VIEW 構造内の TIMEOUT 値よりも長くなりました。 TIMEOUT 値を増やすか、無限に待つことを表す "-1" を設定してください。
19 - 24 内部使用専用。

Top of page