次の方法で共有


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

パイプ

/大井