在 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

/Oi