在 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
相关主题