Compartilhar via


Definindo pipes em arquivos IDL

Quando um pipe é definido em um arquivo IDL, o compilador MIDL gera uma estrutura de controle de pipe cujos membros são ponteiros para os procedimentos push, pull e alloc, bem como uma variável de estado que coordena esses procedimentos. O aplicativo cliente inicializa os campos na estrutura de controle de pipe, mantém sua variável de estado e gerencia a transferência de dados com suas próprias funções push, pull e alloc. O código stub do cliente chama essas funções de aplicativo em loops durante a transferência de dados. Para um pipe de entrada, o stub do cliente realiza marshaling dos dados de transferência e os transmite para o stub do servidor. Para um pipe de saída, o stub do cliente desmarca os dados em um buffer e passa um ponteiro para esse buffer de volta para o aplicativo cliente.

O código stub do servidor inicializa os campos da estrutura de controle de pipe para uma variável de estado, bem como ponteiros para efetuar push e pull de rotinas. O stub do servidor mantém o estado e gerencia seu armazenamento privado para os dados de transferência. O aplicativo de servidor chama as rotinas de pull e push em loops durante a chamada de procedimento remoto, pois recebe e desmarca dados do stub do cliente ou realiza marshals e transmite dados para o stub do cliente.

O arquivo IDL de exemplo a seguir define um tipo de pipe LONG_PIPE, cujo tamanho do elemento é definido por tempo. Ele também declara protótipos de função para o procedimento remoto chamar InPipe e OutPipe, para enviar e receber dados, respectivamente. Quando o compilador MIDL processa o arquivo IDL, ele gera o arquivo de cabeçalho mostrado no exemplo.

Exemplo

// 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

Tubo

/Oi