Delen via


Parameterdescriptors

Zoals eerder vermeld, bestaan -Oi en –Oif stijlparameterdescriptors.

De descriptors van de –Oi-parameter

Volledig geïnterpreteerde stubs vereisen aanvullende informatie voor elk van de parameters in een RPC-aanroep. De parameterbeschrijvingen van een procedure volgen direct na de beschrijving van de procedure.

Simple –Oi

parameterdescriptors

De indeling voor de beschrijving van een [in] of retourneer eenvoudige typeparameter is:

FC_IN_PARAM_BASETYPE 
simple_type<1>

–of–

FC_RETURN_PARAM_BASETYPE 
simple_type<1>

Waarbij simple_type<1> het FC-token is dat het eenvoudige type aangeeft. De codes zijn als volgt:

4e  FC_IN_PARAM_BASETYPE 
53  FC_RETURN_PARAM_BASETYPE

Overige -Oi-

parameterdescriptors

De indeling voor de beschrijving voor alle andere parametertypen is:

param_direction<1> 
stack_size<1> 
type_offset<2>

Wanneer het veld param_direction<1> voor elk van deze beschrijvingen een van deze beschrijvingen moet zijn die worden weergegeven in de volgende tabel.

Hex Vlag Betekenis
4d FC_IN_PARAM Een in-parameter.
50 FC_IN_OUT_PARAM Een in/uit-parameter.
51 FC_OUT_PARAM Een out-parameter.
52 FC_RETURN_PARAM Een retourwaarde voor een procedure.
4f FC_IN_PARAM_NO_FREE_INST Een in xmit/rep als parameter waarvoor geen vrijmaken wordt gemaakt.

 

De stack_size<1> is de grootte van de parameter op de stack, uitgedrukt in het aantal gehele getallen dat de parameter op de stack in beslag neemt.

Notitie

De -Oi-modus wordt niet ondersteund op 64-bits platforms.

 

Het veld type_offset<2> is de verschuiving in de tekenreekstabel voor het typenotatie, waarmee de typedescriptor voor het argument wordt aangegeven.

De descriptors voor –Oif-parameters

Er zijn twee mogelijke indelingen voor een parameterbeschrijving, een voor basistypen, een voor alle andere typen.

Basistypen:

PARAM_ATTRIBUTES<2> 
stack_offset<2> 
type_format_char<1> 
unused<1>

Ander:

PARAM_ATTRIBUTES<2> 
stack_offset<2> 
type_offset<2>

In beide stack_offset<2> geeft de verschuiving op de virtuele argumentstack in bytes aan. Voor basistypen wordt het argumenttype rechtstreeks gegeven door het notatieteken dat overeenkomt met het type. Voor andere typen geeft het veld type_offset<2> de verschuiving in de tekenreekstabel voor de typenotatie waarin de typedescriptor voor het argument zich bevindt.

Het parameterkenmerkveld wordt als volgt gedefinieerd:

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;
  • De MustSize bit is alleen ingesteld als de parameter moet worden aangepast.
  • De MustFree bit is ingesteld als de server de NdrFree* routine van de parameter moet aanroepen.
  • De IsSimpleRef- bit is ingesteld voor een parameter die een verwijzingsaanwijzer is naar iets anders dan een andere aanwijzer en waarvoor geen kenmerken zijn toegewezen. Voor een dergelijk type biedt het type_offset<> veld van de parameterbeschrijving, met uitzondering van een verwijzingswijzer naar een basistype, de verschuiving naar het type van de verwijzing; de verwijzingsaanwijzer wordt gewoon overgeslagen.
  • De IsDontCallFreeInst bit is ingesteld voor bepaalde represent_as parameters waarvan de routines van het gratis exemplaar niet mogen worden aangeroepen.
  • De ServerAllocSize bits zijn niet-nul als de parameter [], [in], of [in,] aanwijzer naar aanwijzer of aanwijzer naar enum16 is en wordt geïnitialiseerd op de stack van de server-interpreter, in plaats van een aanroep naar I_RpcAllocatete gebruiken. Als deze waarde niet nul is, wordt deze waarde vermenigvuldigd met 8 om het aantal bytes voor de parameter op te halen. Houd er rekening mee dat dit betekent dat ten minste 8 bytes altijd worden toegewezen aan een aanwijzer.
  • De IsBasetype bit is ingesteld voor eenvoudige typen die worden marshaled door de hoofd--Oif interpreter-lus. Met name een eenvoudig type met een bereikkenmerk wordt niet gemarkeerd als basistype om het bereik routine marshaling via verzending af te dwingen met behulp van een FC_RANGE token.
  • De IsByValue bit is ingesteld voor samengestelde typen die worden verzonden op waarde, maar is niet ingesteld voor eenvoudige typen, ongeacht of het argument een aanwijzer is. De samengestelde typen waarvoor het is ingesteld, zijn structuren, samenvoegingen, transmit_as, represent_as, wire_marshal en SAFEARRAY. Over het algemeen werd de bit geïntroduceerd voor het voordeel van de hoofd-interpreterlus in de -Oicf interpreter, om ervoor te zorgen dat de niet-simple-argumenten (ook wel samengestelde typeargumenten genoemd) correct worden gededucteerd. Deze bit is nooit gebruikt in eerdere versies van de interpreter.