Descripteurs de paramètres
Comme mentionné précédemment, les descripteurs de paramètres de style –Oi et –Oif existent.
Descripteurs de paramètre –Oi
Les stubs entièrement interprétés nécessitent des informations supplémentaires pour chacun des paramètres d’un appel RPC. Les descriptions des paramètres d’une procédure suivent immédiatement après la description de la procédure.
Descripteurs de paramètres
Le format de la description d’un paramètre de type simple [in] ou de retour est le suivant :
FC_IN_PARAM_BASETYPE
simple_type<1>
–ou–
FC_RETURN_PARAM_BASETYPE
simple_type<1>
Où simple_type<1> est le jeton FC indiquant le type simple. Les codes sont les suivants :
4e FC_IN_PARAM_BASETYPE
53 FC_RETURN_PARAM_BASETYPE
Autre –Oi
Descripteurs de paramètres
Le format de la description de tous les autres types de paramètres est le suivant :
param_direction<1>
stack_size<1>
type_offset<2>
Où le champ param_direction<1> pour chacune de ces descriptions doit être l’une de celles indiquées dans le tableau suivant.
Hex | Indicateur | Signification |
---|---|---|
4d | FC_IN_PARAM | Paramètre in. |
50 | FC_IN_OUT_PARAM | Paramètre d’entrée/sortie. |
51 | FC_OUT_PARAM | Paramètre de sortie. |
52 | FC_RETURN_PARAM | Valeur de retour de procédure. |
4f | FC_IN_PARAM_NO_FREE_INST | dans xmit/rep comme paramètre pour lequel aucune libération n’est effectuée. |
La stack_size<1> est la taille du paramètre sur la pile, exprimée en tant que nombre d’entiers occupés par le paramètre sur la pile.
Notes
Le mode –Oi n’est pas pris en charge sur les plateformes 64 bits.
Le champ type_offset<2> est le décalage dans la table de chaînes de format de type, indiquant le descripteur de type pour l’argument.
Les descripteurs de paramètre –Oif
Il existe deux formats possibles pour une description de paramètre, l’un pour les types de base, l’autre pour tous les autres types.
Types de base :
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
Autres :
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
Dans les deux stack_offset<2> indique le décalage sur la pile d’arguments virtuelle, en octets. Pour les types de base, le type d’argument est donné directement par le caractère de format correspondant au type. Pour les autres types, le champ type_offset<2> donne le décalage dans la table de chaînes de format de type où se trouve le descripteur de type pour l’argument.
Le champ d’attribut de paramètre est défini comme suit :
typedef struct
{
unsigned short MustSize : 1; // 0x0001
unsigned short MustFree : 1; // 0x0002
unsigned short IsPipe : 1; // 0x0004
unsigned short IsIn : 1; // 0x0008
unsigned short IsOut : 1; // 0x0010
unsigned short IsReturn : 1; // 0x0020
unsigned short IsBasetype : 1; // 0x0040
unsigned short IsByValue : 1; // 0x0080
unsigned short IsSimpleRef : 1; // 0x0100
unsigned short IsDontCallFreeInst : 1; // 0x0200
unsigned short SaveForAsyncFinish : 1; // 0x0400
unsigned short Unused : 2;
unsigned short ServerAllocSize : 3; // 0xe000
} PARAM_ATTRIBUTES, *PPARAM_ATTRIBUTES;
- Le bit MustSize est défini uniquement si le paramètre doit être dimensionné.
- Le bit MustFree est défini si le serveur doit appeler la routine NdrFree* du paramètre.
- Le bit IsSimpleRef est défini pour un paramètre qui est un pointeur de référence vers autre chose qu’un autre pointeur et qui n’a pas d’attributs d’allocation. Pour un tel type, le champ type_offset<> de la description du paramètre, à l’exception d’un pointeur de référence vers un type de base, fournit le décalage par rapport au type du référence ; le pointeur de référence est simplement ignoré.
- Le bit IsDontCallFreeInst est défini pour certains paramètres represent_as dont les routines de instance libre ne doivent pas être appelées.
- Les bits ServerAllocSize sont différents de zéro si le paramètre est [out], [in], ou [in,out] pointeur vers pointeur ou pointeur vers enum16, et sont initialisés sur la pile de l’interpréteur de serveur, au lieu d’utiliser un appel à I_RpcAllocate. Si elle est différente de zéro, cette valeur est multipliée par 8 pour obtenir le nombre d’octets pour le paramètre . Notez que cela signifie qu’au moins 8 octets sont toujours alloués pour un pointeur.
- Le bit IsBasetype est défini pour les types simples qui sont marshalés par la boucle d’interpréteur main –Oif. En particulier, un type simple avec un attribut de plage n’est pas marqué comme type de base afin de forcer le marshaling de la routine de plage via la distribution à l’aide d’un jeton FC_RANGE.
- Le bit IsByValue est défini pour les types composés envoyés par valeur, mais n’est pas défini pour les types simples, que l’argument soit un pointeur ou non. Les types composés pour lesquels il est défini sont les structures, les unions, les transmit_as, les represent_as, les wire_marshal et SAFEARRAY. En général, le bit a été introduit au profit de la boucle d’interpréteur main dans l’interpréteur –Oicf, afin de garantir que les arguments non simples (appelés arguments de type composé) sont correctement déréférencés. Ce bit n’a jamais été utilisé dans les versions précédentes de l’interpréteur.