Definición de canalizaciones en archivos IDL
Cuando se define una canalización en un archivo IDL, el compilador MIDL genera una estructura de control de canalización cuyos miembros son punteros a procedimientos de inserción, extracción y asignación, así como una variable de estado que coordina estos procedimientos. La aplicación cliente inicializa los campos de la estructura de control de canalización, mantiene su variable de estado y administra la transferencia de datos con sus propias funciones de inserción, extracción y asignación. El código auxiliar del cliente llama a estas funciones de aplicación en bucles durante la transferencia de datos. Para una canalización de entrada, el código auxiliar del cliente serializa los datos de transferencia y los transmite al código auxiliar del servidor. Para una canalización de salida, el código auxiliar del cliente desenlace los datos en un búfer y pasa un puntero a ese búfer de nuevo a la aplicación cliente.
El código auxiliar del servidor inicializa los campos de la estructura de control de canalización en una variable de estado, así como punteros para insertar y extraer rutinas. El código auxiliar del servidor mantiene el estado y administra su almacenamiento privado para los datos de transferencia. La aplicación de servidor llama a las rutinas de extracción e inserción en bucles durante la llamada a procedimiento remoto a medida que recibe y desenlace los datos del código auxiliar del cliente, o serializa y transmite datos al código auxiliar del cliente.
El siguiente archivo IDL de ejemplo define un tipo de canalización LONG_PIPE, cuyo tamaño de elemento se define siempre. También declara prototipos de función para que el procedimiento remoto llame a InPipe y OutPipe, para enviar y recibir datos, respectivamente. Cuando el compilador MIDL procesa el archivo IDL, genera el archivo de encabezado que se muestra en el ejemplo.
Ejemplo
// 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
Temas relacionados