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 les procédures push, pull et alloc, ainsi qu’une variable d’état qui coordonne ces procédures. L’application cliente initialise les champs dans la structure de contrôle de 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 client appelle ces fonctions d’application en 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 du serveur. Pour un canal de sortie, le stub client démarhale 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 vers une variable d’état, ainsi que des pointeurs vers les routines push et pull. Le stub du serveur conserve l’état et gère son stockage privé pour les données de transfert. L’application serveur appelle les routines pull 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 les données au stub client.
L’exemple de fichier IDL suivant définit un type de canal LONG_PIPE, dont la taille d’élément est définie comme long. Il déclare également des prototypes de fonction pour les appels de procédure distante InPipe et OutPipe, 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
Rubriques connexes