Poignées
Jusqu’à deux parties dans la description de la chaîne de format d’une adresse de procédure gère. La première partie est le type de handle _<1> champ de la description d’une procédure, utilisé pour indiquer des handles implicites. Cette partie est toujours présente. La deuxième partie est une description de paramètre d’un handle explicite de la procédure. Les deux sont expliqués dans les sections suivantes, ainsi qu’une discussion de la prise en charge supplémentaire du compilateur MIDL de la structure du descripteur de stub pour les problèmes de handle de liaison.
Handles implicites
Si une procédure utilise un handle implicite pour la liaison, le _ type de handle<1> champ de la description de la procédure contient une des trois valeurs non nulles valides. La prise en charge du compilateur MIDL pour les handles implicites se trouve dans le _ _ champ informations de handle implicite de la structure du descripteur stub :
typedef (__RPC_FAR * GENERIC_BINDING_ROUTINE)();
typedef struct
{
GENERIC_BINDING_ROUTINE pfnBind;
GENERIC_BINDING_ROUTINE pfnUnbind;
} GENERIC_BINDING_ROUTINE_PAIR;
typedef struct __GENERIC_BINDING_INFO
{
void __RPC_FAR* pObj;
unsigned char Size;
GENERIC_BINDING_ROUTINE pfnBind;
GENERIC_BINDING_ROUTINE pfnUnbind;
} GENERIC_BINDING_INFO, *PGENERIC_BINDING_INFO;
union
{
handle_t* pAutoHandle;
handle_t* pPrimitiveHandle;
PGENERIC_BINDING_INFO pGenericBindingInfo;
} IMPLICIT_HANDLE_INFO;
Si la procédure utilise un descripteur automatique, le membre pAutoHandle contient l’adresse de la variable de handle stub définie-auto.
Si la procédure utilise un handle primitif implicite, le membre pPrimitiveHandle contient l’adresse de la variable de handle stub définie-primitive.
Enfin, si la procédure utilise un handle générique implicite, le membre pGenericBindingInfo contient l’adresse du pointeur vers la structure d' _ _ informations de liaison générique correspondante. La _ _ Description du stub MIDL de la structure de données contient un pointeur vers une collection de structures de _ _ paires de liaisons génériques . L’entrée dans la position zéro de cette collection est réservée aux routines de liaison et de séparation correspondant au handle de liaison générique référencé par pGenericBindingInfo dans les _ _ informations de handle implicites. Le type de handle de liaison implicite est indiqué dans la chaîne de format.
Handles explicites
Il existe trois types de handle explicites possibles : Context, Generic et primitive. Dans le cas d’un handle explicite (ou d’un [ ] handle de contexte out uniquement, qui est géré de la même façon), les informations de handle de liaison s’affichent sous la forme de l’un des paramètres de la procédure. Les trois descriptions possibles sont les suivantes.
Primitives
FC_BIND_PRIMITIVE, flag<1>, offset<2>.
L’indicateur<1> indique si le handle est passé par un pointeur.
Le décalage<2> fournit le décalage à partir du début de la pile jusqu’au handle primitif.
Notes
Une description de handle primitif dans la chaîne de format de type est réduite à une seule valeur FC _ ignorée.
Générique
FC_BIND_GENERIC, flag_and_size<1>, offset<2>, binding_routine_pair_index<1>, FC_PAD
L’indicateur _ et la _ taille<1> ont le grignot d’indicateur supérieur et le Quartet de la taille inférieure. L’indicateur indique si le handle est passé par un pointeur. Le champ Taille fournit la taille du type de handle générique défini par l’utilisateur. Cette taille est limitée à 1, 2 ou 4 octets sur les systèmes 32 bits et 1, 2, 4 ou 8 octets sur les systèmes 64 bits.
Le champ décalage<2> fournit le décalage à partir du début de la pile du pointeur vers les données de la taille donnée.
L' _ _ index de paire de routines de liaison _<1> champ donne l’index dans le champ AGenericBindingRoutinePairs du descripteur stub aux pointeurs de fonction de liaison et de détachement de la fonction de routine pour le handle générique.
Notes
Une description de handle générique dans le format de type est la description du type de données associé uniquement.
Context
FC_BIND_CONTEXT flags<1> offset<2> context_rundown_routine_index<1> param_num<1>
Les indicateurs<1> indiquent comment le descripteur est passé et le type. Les indicateurs valides sont indiqués dans le tableau suivant.
| Hex | Indicateur |
|---|---|
| 80 | le _ paramètre handle _ est _ via _ ptr |
| 40 | le _ paramètre _ du handle est _ in |
| 20 | le _ paramètre de handle _ est _ out |
| 21 | le _ paramètre handle _ est _ retourné |
| 08 | _handle de _ contexte _ strict NDR |
| 04 | descripteur de contexte de NDR _ _ _ non _ Serialize |
| 02 | désérialisation du _ handle de contexte NDR _ _ |
| 01 | le _ _ descripteur de contexte NDR _ ne peut pas _ être _ null |
les quatre premiers indicateurs ont toujours été présents, les quatre derniers ont été ajoutés à Windows 2000.
Le champ décalage<2> fournit le décalage à partir du début de la pile jusqu’au handle de contexte.
L' _ _ _ index de routine d’arrêt de contexte<1> fournit un index dans le champ apfnNdrRundownRoutines du descripteur stub à la routine d’arrêt utilisée pour ce handle de contexte. Le compilateur génère toujours un index. Pour les routines qui n’ont pas de routine d’arrêt, il s’agit d’un index d’une position de table qui contient la valeur null.
Pour les stubs intégrés à – Oi2, le paramètre param _ num<1> fournit le nombre ordinal, en commençant à zéro, en spécifiant le handle de contexte dans la procédure donnée.
Pour les versions précédentes de l’interpréteur, le _ paramètre param num<1> fournit le numéro de paramètre du descripteur de contexte, à partir de zéro, dans sa procédure.
Notes
Une description de handle de contexte dans la chaîne de format de type n’a pas le décalage<2> dans la description.
Nouvel en-tête de l’interfaces de création
Comme mentionné précédemment, l’en-tête – de l’extension de la fonction se développe sur l’en-tête – OI . Pour plus de commodité, tous les champs sont affichés ici :
(L’ancien en-tête)
handle_type<1>
Oi_flags<1>
[rpc_flags<4>]
proc_num<2>
stack_size<2>
[explicit_handle_description<>]
(Les extensions de-l’extension de l' interfaces )
constant_client_buffer_size<2>
constant_server_buffer_size<2>
INTERPRETER_OPT_FLAGS<1>
number_of_params<1>
La _ _ taille de la mémoire tampon du client constante _<2> fournit la taille de la mémoire tampon de marshaling qui aurait pu être précalculée par le compilateur. Il peut s’agir d’une taille partielle, car l’indicateur ClientMustSize déclenche le dimensionnement.
La _ _ taille de la mémoire tampon du serveur constante _<2> fournit la taille de la mémoire tampon de marshaling telle qu’elle est précalculée par le compilateur. Il peut s’agir d’une taille partielle, car l’indicateur ServerMustSize déclenche le dimensionnement.
Les indicateurs de l’INTERPRÉTeur _ OPT _ sont définis dans Ndrtypes. h :
typedef struct
{
unsigned char ServerMustSize : 1; // 0x01
unsigned char ClientMustSize : 1; // 0x02
unsigned char HasReturn : 1; // 0x04
unsigned char HasPipes : 1; // 0x08
unsigned char Unused : 1;
unsigned char HasAsyncUuid : 1; // 0x20
unsigned char HasExtensions : 1; // 0x40
unsigned char HasAsyncHandle : 1; // 0x80
} INTERPRETER_OPT_FLAGS, *PINTERPRETER_OPT_FLAGS;
- Le bit ServerMustSize est défini si le serveur doit effectuer une passe de dimensionnement de la mémoire tampon.
- Le bit ClientMustSize est défini si le client doit effectuer une passe de dimensionnement de la mémoire tampon.
- Le bit HasReturn est défini si la procédure a une valeur de retour.
- Le bit HasPipes est défini si le package de canal doit être utilisé pour prendre en charge un argument de canal.
- Le bit HasAsyncUuid est défini si la procédure est une procédure DCOM asynchrone.
- le bit HasExtensions indique que les extensions Windows 2000 et ultérieures sont utilisées.
- Le bit HasAsyncHandle indique une procédure RPC asynchrone.
Le bit HasAsyncHandle a été initialement utilisé pour une implémentation DCOM différente de la prise en charge de Async et n’a donc pas pu être utilisé pour la prise en charge actuelle du style asynchrone dans DCOM. Le bit HasAsyncUuid indique actuellement cela.