Microsoft RPC Binding-Handle Extensions

Les extensions Microsoft du langage IDL prennent en charge plusieurs paramètres de handle qui apparaissent à des emplacements autres que le premier paramètre, le plus à gauche. Les étapes suivantes décrivent la séquence que le compilateur MIDL effectue pour résoudre le paramètre binding-handle en mode de compatibilité DCE (/osf) et en mode par défaut (microsoft étendu).

Mode de compatibilité DCE

  • Handle de liaison qui apparaît en première position.
  • Paramètre [in, context_handle] le plus à gauche.
  • Handle de liaison implicite spécifié par [implicit_handle] ou [auto_handle].
  • Si aucun ACF n’est présent, l’utilisation par défaut de [auto_handle].

Mode par défaut

  • Handle de liaison explicite le plus à gauche.
  • Handle de liaison implicite spécifié par [implicit_handle] ou [auto_handle].
  • Si aucun ACF n’est présent, l’utilisation par défaut de [auto_handle].

Les compilateurs IDL DCE recherchent un handle de liaison explicite comme premier paramètre. Lorsque le premier paramètre n’est pas un handle de liaison et qu’un ou plusieurs handles de contexte sont spécifiés, le handle de contexte le plus à gauche est utilisé comme handle de liaison. Lorsque le premier paramètre n’est pas un handle et qu’il n’existe pas de handles de contexte, la procédure utilise une liaison implicite à l’aide de l’attribut ACF [implicit_handle] ou [auto_handle].

Les extensions Microsoft de l’IDL permettent au handle de liaison d’être dans une position autre que le premier paramètre. Le paramètre le plus à gauche [in] explicit-handle( qu’il s’agisse d’un handle primitif, défini par le programmeur ou de contexte) est le handle de liaison. Lorsqu’il n’existe aucun paramètre de handle, la procédure utilise une liaison implicite à l’aide de l’attribut ACF [implicit_handle] ou [auto_handle].

Les règles suivantes s’appliquent au mode de compatibilité DCE (/osf) et au mode par défaut :

  • La liaison de handle automatique est utilisée lorsqu’aucun ACF n’est présent.
  • Les handles explicites [in] ou [in, out] pour une fonction individuelle préempte toute liaison implicite spécifiée pour l’interface.
  • Plusieurs handles primitifs [in] ou [in, out] primitifs ne sont pas pris en charge.
  • Plusieurs handles de contexte explicites [in] ou [in, out] sont autorisés.
  • Tous les paramètres de handle définis par le programmeur, à l’exception du paramètre binding-handle, sont traités comme des données transmissibles.

Le tableau suivant contient des exemples et décrit comment les handles de liaison sont attribués dans chaque mode de compilateur.

Exemple Description
void proc1( void );
Aucun handle explicite n’est spécifié. Le handle de liaison implicite, spécifié par [ implicit_handle] ou [ auto_handle], est utilisé. Lorsqu’aucun ACF n’est présent, un handle automatique est utilisé.
void proc2([in] handle_t H,           [in] short s );
Un handle explicite de type handle_t est spécifié. Le paramètre H est le handle de liaison de la procédure.
void proc3([in] short s,           [in] handle_t H );
Le premier paramètre n’est pas un handle. En mode par défaut, le paramètre de handle le plus à gauche, H, est le handle de liaison. En mode /osf, la liaison implicite est utilisée. Une erreur est signalée, car le deuxième paramètre est censé être transmissible et handle_t ne peut pas être transmis.
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
Le premier paramètre n’est pas un handle. En mode par défaut, le paramètre de handle le plus à gauche, H, est le handle de liaison. Les stubs appellent les routines fournies par l’utilisateur MY_HDL_bind et MY_HDL_unbind. En mode/osf, la liaison implicite est utilisée. Le paramètre de handle défini par le programmeur H est traité comme des données transmissibles.
Typedef [handle] short * MY_HDL;void proc1([in] MY_HDL H,            [in] MY_HDL p );
Le premier paramètre est un handle de liaison. Le paramètre H est le paramètre binding-handle. Le deuxième paramètre handle défini par le programmeur est traité comme des données transmissibles.
Typedef [context_handle] void * CTXT_HDL;void proc1([in] short s,           [in] long l,           [in] CTXT_HDL H ,           [in] char c);
Le handle de liaison est un handle de contexte. Le paramètre H est le handle de liaison.