IDL ファイルでのパイプの定義
パイプが IDL ファイルで定義されている場合、MIDL コンパイラは、プッシュ、プル、アロケーション プロシージャへのポインター、およびこれらのプロシージャを調整する状態変数をメンバーとするパイプ 制御構造体を生成します。 クライアント アプリケーションは、パイプ制御構造のフィールドを初期化し、その状態変数を維持し、独自のプッシュ、プル、アロケーション関数を使用してデータ転送を管理します。 クライアント スタブ コードは、データ転送中にループでこれらのアプリケーション関数を呼び出します。 入力パイプの場合、クライアント スタブは転送データをマーシャリングしてサーバー スタブに送信します。 出力パイプの場合、クライアント スタブはデータをバッファーにアンマーシャリングし、そのバッファーへのポインターをクライアント アプリケーションに渡します。
サーバー スタブ コードは、パイプ制御構造体のフィールドを状態変数に初期化し、プッシュ ルーチンとプル ルーチンへのポインターを初期化します。 サーバー スタブは状態を維持し、転送データのプライベート ストレージを管理します。 サーバー アプリケーションは、クライアント スタブからのデータの受信とマーシャリング解除、またはクライアント スタブへのデータのマーシャリングと送信を行う際に、リモート プロシージャ呼び出し中にループ内のプルおよびプッシュ ルーチンを呼び出します。
次の IDL ファイルの例では、要素のサイズが long として定義されているパイプの種類LONG_PIPEを定義します。 また、リモート プロシージャ呼び出し InPipe と OutPipe の関数プロトタイプを宣言して、それぞれデータの送受信を行います。 MIDL コンパイラは、IDL ファイルを処理するときに、例に示すヘッダー ファイルを生成します。
例
// File: pipedemo.idl
typedef pipe long LONG_PIPE;
void InPipe( [in] LONG_PIPE pipe_data );
void OutPipe( [out] LONG_PIPE *pipe_data );
//end pipedemo.idl
// File: pipedemo.h (fragment)
// Generated by the MIDL compiler from pipedemo.idl
typedef struct pipe_LONG_PIPE
{
void (__RPC_FAR * pull) (
char __RPC_FAR * state,
long __RPC_FAR * buf,
unsigned long esize,
unsigned long __RPC_FAR * ecount );
void (__RPC_FAR * push) (
char __RPC_FAR * state,
long __RPC_FAR * buf,
unsigned long ecount );
void (__RPC_FAR * alloc) (
char __RPC_FAR * state,
unsigned long bsize,
long __RPC_FAR * __RPC_FAR * buf,
unsigned long __RPC_FAR * bcount );
char __RPC_FAR * state;
} LONG_PIPE;
void InPipe(
/* [in] */ LONG_PIPE pipe_data);
void OutPipe(
/* [out] */ LONG_PIPE __RPC_FAR *pipe_data);
//end pipedemo.h
関連トピック