Compartir a través de


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

Pipa

/Oi