Definizione di pipe nei file IDL
Quando una pipe viene definita in un file IDL, il compilatore MIDL genera una struttura di controllo della pipe i cui membri sono puntatori alle procedure di push, pull e 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 del client chiama queste funzioni dell'applicazione in cicli durante il trasferimento dei dati. Per una pipe di input, lo stub del client effettua il marshalling dei dati di trasferimento e li trasmette allo stub del server. Per una pipe di output, lo stub client demarsalizza i dati in un buffer e passa un puntatore a tale buffer all'applicazione client.
Il codice stub del server inizializza i campi della struttura di controllo del pipe a una variabile di stato, nonché i puntatori alle routine di push e pull. Lo stub del server mantiene lo stato e gestisce l'archiviazione privata per i dati di trasferimento. L'applicazione server chiama le routine di pull e push in loop durante la procedura di chiamata remota, mentre riceve e smarshalla i dati dallo stub del client, oppure li serializza e li trasmette allo stub del client.
Il file IDL di esempio seguente definisce un tipo di pipe LONG_PIPE, la cui dimensione dell'elemento è definita come long. Dichiara inoltre i prototipi di funzione per le chiamate remote di routine InPipe e OutPipe, rispettivamente per inviare e ricevere 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