Définition de canaux dans des fichiers IDL
Lorsqu’un canal est défini dans un fichier IDL, le compilateur MIDL génère une structure de contrôle de canal dont les membres sont des pointeurs vers des procédures push, pull et Alloc, ainsi qu’une variable d’État qui coordonne ces procédures. L’application cliente initialise les champs de la structure de contrôle du canal, conserve sa variable d’État et gère le transfert de données avec ses propres fonctions push, pull et Alloc. Le code stub du client appelle ces fonctions d’application dans des boucles pendant le transfert de données. Pour un canal d’entrée, le stub client marshale les données de transfert et les transmet au stub serveur. Pour un canal de sortie, le stub client démarshale les données dans une mémoire tampon et transmet un pointeur vers cette mémoire tampon à l’application cliente.
Le code stub du serveur initialise les champs de la structure de contrôle de canal à une variable d’État, ainsi que les pointeurs vers les routines push et pull. Le stub serveur conserve l’État et gère son stockage privé pour les données de transfert. L’application serveur appelle les routines push et push dans des boucles pendant l’appel de procédure distante lorsqu’elle reçoit et démarshale les données du stub client, ou marshale et transmet des données au stub client.
L’exemple de fichier IDL suivant définit un canal de type LONG _ , dont la taille d’élément est définie sur long. Elle déclare également des prototypes de fonction pour les appels de procédure distante et les appels de procédure distante et d’envoi, pour envoyer et recevoir des données, respectivement. Lorsque le compilateur MIDL traite le fichier IDL, il génère le fichier d’en-tête indiqué dans l’exemple.
Exemple
// 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