Sdílet prostřednictvím


Popisovače parametrů

Jak už bylo zmíněno dříve, existují popisovače parametrů stylu –Oi a –O if.

Popisovače parametrů –Oi

Plně interpretované zástupné procedury vyžadují pro každý z parametrů volání RPC další informace. Popisy parametrů procedury následují bezprostředně po popisu procedury.

Simple –Oi

popisovače parametrů

Formát popisu [v] nebo návratový parametr jednoduchého typu je:

FC_IN_PARAM_BASETYPE 
simple_type<1>

–nebo–

FC_RETURN_PARAM_BASETYPE 
simple_type<1>

Kde simple_type<1> je token FC označující jednoduchý typ. Kódy jsou následující:

4e  FC_IN_PARAM_BASETYPE 
53  FC_RETURN_PARAM_BASETYPE

Other –Oi

popisovače parametrů

Formát popisu pro všechny ostatní typy parametrů je:

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

Pokud pole param_direction<1> pro každý z těchto popisů musí být jedním z polí zobrazených v následující tabulce.

Šestnáctkový Vlajka Význam
4d FC_IN_PARAM Parametr in.
50 FC_IN_OUT_PARAM Parametr in/out.
51 FC_OUT_PARAM Výstupní parametr.
52 FC_RETURN_PARAM Návratová hodnota procedury.
4f FC_IN_PARAM_NO_FREE_INST Parametr xmit/rep, pro který se neprovedou žádné uvolnění.

 

Stack_size<1> je velikost parametru v zásobníku vyjádřený počtem celých čísel, které parametr zabírá v zásobníku.

Poznámka

Režim –Oi není podporován na 64bitových platformách.

 

Pole type_offset<2> je posun v tabulce řetězců formátu typu označující popisovač typu argumentu.

Popisovače parametru –Oif

Existují dva možné formáty pro popis parametru, jeden pro základní typy, druhý pro všechny ostatní typy.

Základní typy:

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

Jiný:

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

V obou stack_offset<2> označuje posun v zásobníku virtuálních argumentů v bajtech. U základních typů je typ argumentu uveden přímo znakem formátu, který odpovídá typu. U jiných typů poskytuje pole type_offset<2> posun v tabulce řetězců formátu typu, kde je umístěn popisovač typu argumentu.

Pole atributu parametru je definováno takto:

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;
  • MustSize bit je nastaven pouze v případě, že parametr musí mít velikost.
  • MustFree bit je nastaven, pokud server musí volat rutinu NdrFree* parametru.
  • Bit IsSimpleRef je nastaven pro parametr, který je odkazem na cokoli jiného než jiného ukazatele a který nemá žádné atributy přidělení. U takového typu poskytuje popis parametru type_offset<> pole s výjimkou ukazatele odkazu na základní typ posun typu odkazujícího; ukazatel odkazu se jednoduše přeskočí.
  • IsDontCallFreeInst bit je nastaven pro určité represent_as parametry, jejichž bezplatné instance rutiny by neměly být volány.
  • ServerAllocSize bitů jsou nenulové, pokud je parametr [out], [v], nebo [in, out] ukazatel na ukazatel, nebo ukazatel na výčet16, a inicializuje se v zásobníku interpreta serveru, místo volání I_RpcAllocate. Pokud není hodnota nenulová, tato hodnota se vynásobí číslem 8, aby se získal počet bajtů parametru. Všimněte si, že to znamená, že pro ukazatel se vždy přiděluje alespoň 8 bajtů.
  • IsBasetype bit je nastaven pro jednoduché typy, které jsou zařazovány hlavní –Oif interpret smyčka. Konkrétně jednoduchý typ s atributem rozsahu není označen jako základní typ, aby bylo možné vynutit rutinní zařazování rozsahu prostřednictvím odesílání pomocí tokenu FC_RANGE.
  • IsByValue bit je nastaven pro složené typy odesílané podle hodnoty, ale není nastaven pro jednoduché typy bez ohledu na to, zda je argument ukazatelem. Složené typy, pro které je nastaven, jsou struktury, sjednocení, transmit_as, represent_as, wire_marshal a SAFEARRAY. Obecně platí, že bit byl zaveden pro výhodu hlavní smyčky interpretu v –Oicf interpret, aby se zajistilo, že argumenty bezsimple (označované jako argumenty složeného typu) jsou správně dereferenced. Tento bit se nikdy nepoužíval v předchozích verzích interpreta.