Descripteurs de paramètre

Comme nous l’avons vu précédemment, les descripteurs de paramètre de style -OI et - de type d’environnement de ligne de fonction existent.

Descripteurs de paramètre – OI

Les stubs entièrement interprétés requièrent des informations supplémentaires pour chacun des paramètres d’un appel RPC. Les descriptions de paramètres d’une procédure suivent immédiatement la description de la procédure.

Simple – OI

Descripteurs de paramètre

Le format de la description d’un [ ] paramètre de type simple dans ou retourne est :

FC_IN_PARAM_BASETYPE 
simple_type<1>

–ou–

FC_RETURN_PARAM_BASETYPE 
simple_type<1>

Où le _ type simple<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ètre

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ù la _ direction param<1> champ pour chacune de ces descriptions doit être l’une des valeurs indiquées dans le tableau suivant.

Hex Indicateur Signification
4d FC _ dans _ param Paramètre in.
50 Param. FC _ en _ sortie _ Paramètre in/out.
51 _paramètre de sortie FC _ Paramètre de sortie.
52 _param de retour FC _ Valeur de retour de procédure.
4F FC _ dans _ param _ pas _ d' _ inst gratuit Dans le port de transmission/REP en tant que paramètre pour lequel aucune libération n’est effectuée.

La _ taille de la pile<1> correspond à la taille du paramètre sur la pile, exprimée sous la forme du nombre d’entiers que le paramètre occupe sur la pile.

Notes

Le mode – OI n’est pas pris en charge sur les plateformes 64 bits.

Le _ champ décalage de type<2> est l’offset dans le type table de chaînes de format, indiquant le descripteur de type pour l’argument.

Descripteurs de paramètre – de l’environnement d’exécution

Il existe deux formats possibles pour une description de paramètre, un pour les types de base, un 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 _ décalages de pile<2> indique le décalage sur la pile d’arguments virtuels, en octets. Pour les types de base, le type d’argument est fourni directement par le caractère de format correspondant au type. Pour les autres types, le _ champ décalage de type<2> indique le décalage au sein de la table de chaînes de format de type où se trouve le descripteur de type de l’argument.

Le champ 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 tout autre pointeur, et qui n’a pas d’attribut d’allocation. Pour un tel type, l’offset de type de la description du paramètre _<> champ, à l’exception d’un pointeur de référence vers un type de base, fournit l’offset au type du référent ; le pointeur de référence est simplement ignoré.
  • Le bit IsDontCallFreeInst est défini pour certains _ paramètres, dont les routines d’instance gratuite ne doivent pas être appelées.
  • Les bits ServerAllocSize sont non nuls si le paramètre a la valeur [ out ] , [ in ] , ou [ in, out pointeur ] vers le pointeur, ou pointeur vers enum16, et seront initialisés sur la pile de l’interpréteur de serveur, au lieu d’utiliser un appel à I _ RpcAllocate. Si la valeur 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 de l’interpréteur main - out. En particulier, un type simple avec un attribut de plage sur celui-ci n’est pas marqué comme type de base afin de forcer le marshaling de routines de la routine de plage via la distribution à l’aide d’un _ jeton de plage FC.
  • Le bit IsByValue est défini pour les types composés qui sont envoyés par valeur, mais n’est pas défini pour les types simples, que l’argument soit ou non un pointeur. Les types composés pour lesquels il est défini sont les structures, les unions, les transmissions _ en tant que , le _ _ marshaleur de câble et SAFEARRAY. En général, le bit a été introduit pour l’avantage de la boucle de l’interpréteur principale dans l’interpréteur – Oicf , pour s’assurer 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.