Partager via


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.

Simple –Oi

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.