Definizione di pipe nei file IDL
Quando una pipe viene definita in un file IDL, il compilatore MIDL genera una struttura di controllo pipe i cui membri sono puntatori per eseguire il push, il pull e le routine di allocazione, nonché una variabile di stato che coordina queste procedure. L'applicazione client inizializza i campi nella struttura di controllo pipe, mantiene la variabile di stato e gestisce il trasferimento dei dati con le proprie funzioni push, pull e alloc. Il codice stub client chiama queste funzioni dell'applicazione in cicli durante il trasferimento dei dati. Per una pipe di input, lo stub client effettua il marshalling dei dati di trasferimento e li trasmette allo stub del server. Per una pipe di output, lo stub del client annulla ilmarsaling dei dati in un buffer e passa un puntatore a tale buffer all'applicazione client.
Il codice stub del server inizializza i campi della struttura del controllo pipe a una variabile di stato, nonché i puntatori per eseguire il push e il pull delle routine. Lo stub del server mantiene lo stato e gestisce la relativa risorsa di archiviazione privata per i dati di trasferimento. L'applicazione server chiama le routine pull e push in cicli durante la chiamata di procedura remota durante la ricezione e l'annullamento del marshalling dei dati dallo stub del client o il marshalling e trasmette i dati allo stub del client.
Il file IDL di esempio seguente definisce un tipo di pipe LONG_PIPE, la cui dimensione dell'elemento è definita fino a quando. Dichiara inoltre i prototipi di funzione per le chiamate remote procedure InPipe e OutPipe, rispettivamente per inviare e ricevere i dati. Quando il compilatore MIDL elabora il file IDL, genera il file di intestazione illustrato nell'esempio.
Esempio
// 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
Argomenti correlati