MeFtとDDE連携するDDEサーバは、MeFtのDDE連携のプロトコルに対応して作成する必要があります。ここでは、DDEサーバに求められるプロトコルの仕様について、システムAPIの知識を前提に記述しています。
MeFtのDDE連携は、DDEML(DDE管理ライブラリ)をとおして行われます。
DDE連携の対話内容ごとに使用するメッセージの引数と対応する文字列について以下に述べます。
DDE連携の通信確立に使用するWin32 APIはDdeConnect関数です。次の2つのキーワードをDdeCreateStringHandle関数でハンドルとして登録して、DdeConnect関数で通信の確立を行います。
サービス名は、通信確立時にDDEサーバを特定する文字列です。
MeFtは、ウィンドウ情報ファイルのDDEATTN(DDE連携アテンション)で指定したDDEサーバ名の実行ファイルのうち、フォルダパスと拡張子を除く文字列をサービス名として登録し、DDEサーバへ送信する際のメッセージの引数に使用します。DDEサーバは、MeFtからの送信に際し、MeFtから渡したサービス名をチェックして、通信を確立します。
トピック名は、通信確立時にDDEサーバの対話モードを決定するための文字列です。
トピック名は、ウィンドウ情報ファイルのDDEATTN(DDE連携アテンション)で設定します。
通信確立時の概略シーケンスを図に示します。
MeFtからDDEサーバへのデータ送信に使用するWin32 APIはDdeClientTransaction関数です。使用するトランザクションはXTY_POKEトランザクションです。
XTYP_POKEトランザクションで、DDEサーバのコールバック関数が受信するバラメータを以下に示します。
DdeQueryString関数を用いて、DDEクライアントから送信したデータフォーマット名を入手できます。MeFtと通信を行うDDEサーバは、データフォーマット名が文字列 "MefSmedForm"であることを確認してからデータを入手してください。
ウィンドウ情報ファイルのDDEATTN(DDE連携アテンション)で指定したトピック名のハンドルを格納しています。サーバがトピック名ごとに違った処理をする仕様ならば、DdeQueryString関数を用いてハンドル名からトピック名を入手してください。
DdeQueryString関数を用いて、DDEクライアントから送信したアイテム名を入手できます。MeFtと通信を行うDDEサーバは、アイテム名が文字列"MefSmeddata"であることを確認してからデータを入手してください。
MeFtが送信したデータのハンドルを格納しています。DdeQueryString関数を用いてハンドル名からデータを入手してください。
このデータの形式を、送信データの形式に示します。
MeFtからDDEサーバへのデータ送信の概略シーケンスを、図に示します。
送信データは、以下の情報で構成します。
入力処理中の定義体名を示す文字列です。
DDE連携を開始したときの入力で項目群指定している場合は、項目群名を示す文字列です。DDE連携を開始したときの入力で項目名指定している場合は、項目名を示す文字列です。
DDE連携を開始したときのカーソルのある項目の項目名を示す文字列です。
DDE連携を開始したときのカーソル位置のことです。
カーソル位置は、論理画面の原点を(1,1)としたときの座標を示します。
DDE連携のトリガーとなった論理アテンションを示す文字列です。
レコードデータのコード系を格納しています。
0x01 | : | JIS8+シフトJIS |
0x02 | : | EUC |
入力処理中の定義体に対応するレコードデータの内容を示す情報です。
本情報は、DDE連携のトリガーとなったアテンションが、定義体上で‘データ付き'で定義しているか‘データなし'で定義しているかによって異なります。
入力依頼時に利用者プログラムが指定したレコードデータに以下の情報を格納します。
入力対象のレコードデータ項目に対応する入力データを、項目属性にしたがって編集したデータで格納します。
入力対象のレコードデータ項目に対応する項目制御部に、入力データをもとにして設定する入力情報を格納します。
入力依頼時に利用者プログラムが指定したレコードデータの内容をそのまま格納します。
MeFtからDDEサーバへのデータ要求に使用するWindowsシステムのAPIはDdeClientTransaction関数です。使用するトランザクションはXTY_REQUESTトランザクションです。
XTYP_REQUESTトランザクションで、DDEサーバのコールバック関数が受信するバラメータを以下に示します。
DdeQueryString関数を用いて、DDEクライアントから送信したデータフォーマット名を入手できます。MeFtと通信を行うDDEサーバは、データフォーマット名が文字列"MefRecordForm"であることを確認してから、データを送信してください。
ウィンドウ情報ファイルのDDEATTN(DDE連携アテンション)で指定したトピック名のハンドルを格納しています。サーバがトピック名ごとに違った処理をする仕様ならば、DdeQueryString関数を用いてハンドル名からトピック名を入手してください。
DdeQueryString関数を用いて、DDEクライアントから送信したアイテム名を入手できます。MeFtと通信を行うDDEサーバは、アイテム名が文字列"MefRecord"であることを確認してからデータを送信してください。
DDEサーバは、データフォーマット名(wFmt)、アイテム名(hsz2)で通信の妥当性をチェックします。その後、トピック名(hsz1)に合わせたデータを作成して、MeFtに返信しなげればなりません。
この返信データを、返信データの形式に基づいて作成してください。作成した返信データを、DdeCreateDataHandle関数でグローバルメモリオブジェクトに格納し、そのハンドルをMeFtに送信します。
DDEサーバからMeFtへの送信が成功した場合は続けてDDE連携の通信終了に入ります。
DDEサーバからMeFtへのデータ送信の概略シーケンスを図に示します。
DDEサーバからMeFtへ返信するデータの形式を図に示します。
DDEサーバからの返信データは以下の情報である必要があります。
レコードデータの設定結果を示す値を2バイトの2進数で設定します。
この情報によりMeFtは受信したレコードデータの内容を有効にするかどうかを判断します。
通知フラグの設定内容を、表に示します。
数値 | 意味 |
---|---|
0x0000 | 返信データは有効です。 |
0xffff | 返信データは無効です。 |
DDE連携終了時にデータを完了するかどうかを4バイト文字列で指定します。本情報にNULL以外の文字列を設定した場合、MeFtはDDE連携の終了に伴い、中断中のデータ入力を完了し、4バイト文字列をアテンションとして、利用者プログラムに通知します。
本情報にNULLを設定した場合、MeFtはDDE連携が終了しても、入力が終了しません。
MeFtからDDEサーバへ送信したレコードデータと同じ形式です。MeFtは、通知フラグが‘有効'の場合に本情報のうち、MeFtが送信したデータ中の項目群または項目に対応する領域の情報を通常の入出力処理と同じ扱いで参照します。このためDDEサーバは、MeFtから送信した送信データの処理中項目群または項目名に対応するレコードデータに情報設定できます。
DDEサーバがレコードデータに設定可能な情報を以下に示します。
MeFtから送信した送信データの項目群または項目に対応するレコードデータ項目
MeFtから送信した送信データの項目群または項目に対応する項目制御部の情報
項目制御部の設定情報のうち以下のものが有効になります。
出力処理の設定情報すべて
入力処理の設定情報の‘カーソル設定'
出力処理と入力処理で項目制御部を共有する(3バイト)場合は、出力処理の設定情報だけを有効にします。