Développement d’interface à l’aide de handles de contexte

En règle générale, vous créez un handle de contexte en spécifiant l’attribut [context_handle] sur une définition de type dans le fichier IDL. La définition de type spécifie également implicitement une routine d’exécution de contexte, que vous devez fournir. Si la communication entre le client et le serveur tombe en panne, l’exécution du serveur appelle cette routine pour effectuer le nettoyage nécessaire. Pour plus d’informations sur les routines d’exécution de contexte, consultez Routine d’exécution du contexte serveur.

Une interface qui utilise un handle de contexte doit avoir un handle de liaison pour la liaison initiale, qui doit avoir lieu avant que le serveur puisse retourner un handle de contexte. Vous pouvez utiliser un handle de liaison automatique, implicite ou explicite pour créer la liaison et établir le contexte.

Un handle de contexte doit être de type void * ou un type qui se résout en void *. Le programme serveur le caste en type requis.

Notes

L’utilisation de [in, out] pour les paramètres de handle de contexte est déconseillée, sauf pour les routines qui ferment les handles de contexte. Si le contexte gère les paramètres marqués [in, out] sont utilisés, ne passez pas de handle de contexte NULL ou non initialisé du client au serveur. Un pointeur NULL vers un handle de contexte doit être passé à la place. Notez que les paramètres de handle de contexte marqués [in] n’acceptent pas les pointeurs NULL .

 

Le fragment suivant d’un exemple de définition d’interface montre comment une application distribuée peut utiliser un handle de contexte pour qu’un serveur ouvre et met à jour un fichier de données pour chaque client.

L’interface doit contenir un appel de procédure distante pour initialiser le handle et le définir sur une valeur non null . Dans cet exemple, la fonction RemoteOpen effectue cette opération. Il spécifie le handle de contexte avec un attribut directionnel [out]. Vous pouvez également retourner le handle de contexte comme valeur de retour de la procédure. Toutefois, dans cet exemple, nous allons passer le handle de contexte via la liste des paramètres.

Dans cet exemple, les informations de contexte sont un handle de fichier. Il effectue le suivi de l’emplacement actuel dans le fichier. L’interface empaquette le handle de fichier en tant que handle de contexte et le transmet en tant que paramètre aux appels de procédure distante. Une structure contient le nom de fichier et le handle de fichier.

/* file: cxhndl.idl (fragment of interface definition file) */
typedef [context_handle] void * PCONTEXT_HANDLE_TYPE;
typedef [ref] PCONTEXT_HANDLE_TYPE * PPCONTEXT_HANDLE_TYPE;
 
short RemoteOpen([out] PPCONTEXT_HANDLE_TYPE pphContext,
    [in, string] unsigned char * pszFile);
 
void RemoteRead(
    [in] PCONTEXT_HANDLE_TYPE phContext,
    [out, size_is(cbBuf)] unsigned char achBuf[],
    [in, out] short *pcbBuf);
 
short RemoteClose([in, out] PPCONTEXT_HANDLE_TYPE pphContext);

La fonction RemoteOpen crée un handle de contexte non null valide. Il transmet le handle de contexte au client. Les appels de procédure distante suivants, tels que RemoteRead, utilisent le handle de contexte comme pointeur dans.

En plus de la procédure distante qui initialise le handle de contexte, l’interface doit contenir une procédure qui libère le contexte du serveur et définit le handle de contexte sur NULL. Dans l’exemple précédent, la fonction RemoteClose effectue cette opération.