在 IDL 檔案中定義管道

在 IDL 檔案中定義管道時,MIDL 編譯器會產生管道控制項結構,其成員是推送、提取和配置程式的指標,以及協調這些程式的狀態變數。 用戶端應用程式會初始化管道控制結構中的欄位、維護其狀態變數,以及使用自己的推送、提取和配置函式來管理資料傳輸。 用戶端存根程式碼會在資料傳輸期間以迴圈方式呼叫這些應用程式函式。 針對輸入管道,用戶端存根會封送處理傳輸資料,並將其傳輸至伺服器存根。 針對輸出管道,用戶端存根會將資料解除封存到緩衝區,並將指標傳遞回用戶端應用程式。

伺服器存根程式碼會將管道控制項結構的欄位初始化為狀態變數,以及推送和提取常式的指標。 伺服器存根會維護狀態,並管理其傳輸資料的私人儲存體。 伺服器應用程式會在遠端程序呼叫期間呼叫提取和推播常式,因為它從用戶端存根接收和取消封送處理資料,或封送處理資料並將資料傳送至用戶端存根。

下列範例 IDL 檔案會定義管線類型LONG_PIPE,其專案大小定義為 long。 它也會宣告遠端程序呼叫 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

/Oi