在IDL檔案中定義管道
在IDL檔案中定義管道時,MIDL 編譯程式會產生管道控件結構,其成員是推送、提取和配置程式的指標,以及協調這些程式的狀態變數。 用戶端應用程式會初始化管道控制結構中的欄位、維護其狀態變數,以及使用自己的推送、提取和配置函式來管理資料傳輸。 用戶端存根程式代碼會在數據傳輸期間在迴圈中呼叫這些應用程式函式。 針對輸入管線,用戶端存根會整合與編排傳輸數據,並將其傳輸至伺服器存根。 對於輸出管道,用戶端存根會將資料解組到緩衝區,並將該緩衝區的指標傳遞回用戶端應用程式。
伺服器存根代碼將管道控制結構的欄位初始化為一個狀態變數,並設置指標以指向推送和提取例程。 伺服器存根會維護狀態,並管理其傳輸數據的私人記憶體。 伺服器程式會在遠端程序呼叫期間迴圈呼叫拉取和推送程序,因為它從用戶端存根接收和取消封送數據,或封送數據並傳送至用戶端存根。
下列範例 IDL 檔案定義了一個管道類型 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
相關主題