Udostępnij za pośrednictwem


Deskryptory parametrów

Jak wspomniano wcześniej, –Oi i –Oif deskryptory parametrów stylu istnieją.

Deskryptory parametrów –Oi

W pełni interpretowane wycinki wymagają dodatkowych informacji dla każdego z parametrów wywołania RPC. Opisy parametrów procedury są zgodne bezpośrednio po opisie procedury.

Simple –Oi

deskryptory parametrów

Format opisu [w] lub zwracany jest prosty parametr typu:

FC_IN_PARAM_BASETYPE 
simple_type<1>

–lub–

FC_RETURN_PARAM_BASETYPE 
simple_type<1>

Gdzie simple_type<1> to token FC wskazujący prosty typ. Kody są następujące:

4e  FC_IN_PARAM_BASETYPE 
53  FC_RETURN_PARAM_BASETYPE

inne — Oi

deskryptory parametrów

Format opisu dla wszystkich innych typów parametrów to:

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

Gdzie pole param_direction<1> dla każdego z tych opisów musi być jednym z tych pól przedstawionych w poniższej tabeli.

Urok Flaga Znaczenie
4d FC_IN_PARAM Parametr in.
50 FC_IN_OUT_PARAM Parametr in/out.
51 FC_OUT_PARAM Parametr wyjściowy.
52 FC_RETURN_PARAM Wartość zwracana przez procedurę.
4f FC_IN_PARAM_NO_FREE_INST In xmit/rep jako parametr, dla którego nie dokonano zwolnienia.

 

Stack_size<1> to rozmiar parametru na stosie, wyrażony jako liczba całkowita, która zajmuje parametr na stosie.

Nuta

Tryb –Oi nie jest obsługiwany na platformach 64-bitowych.

 

Pole type_offset<2> jest przesunięciem w tabeli ciągów formatu typu wskazującym deskryptor typów argumentu.

Deskryptory parametrów –Oif

Istnieją dwa możliwe formaty opisu parametru, jeden dla typów bazowych, drugi dla wszystkich innych typów.

Typy podstawowe:

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

Inny:

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

W obu stack_offset<2> wskazuje przesunięcie na stosie argumentów wirtualnych w bajtach. W przypadku typów podstawowych typ argumentu jest podawany bezpośrednio przez znak formatu odpowiadający typowi. W przypadku innych typów pole type_offset<2> daje przesunięcie w tabeli ciągów formatu typu, w której znajduje się deskryptor typu dla argumentu.

Pole atrybutu parametru jest zdefiniowane w następujący sposób:

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;
  • Bit MustSize jest ustawiany tylko wtedy, gdy parametr musi mieć rozmiar.
  • Bit MustFree jest ustawiany, jeśli serwer musi wywołać procedurę NdrFree* parametru.
  • Bit IsSimpleRef jest ustawiany dla parametru, który jest wskaźnikiem odniesienia do niczego innego niż inny wskaźnik i który nie ma atrybutów przydzielenia. W przypadku takiego typu pole type_offset<> opisu parametru, z wyjątkiem wskaźnika odniesienia do typu podstawowego, zapewnia przesunięcie typu referenta; wskaźnik odniesienia jest po prostu pomijany.
  • Bit IsDontCallFreeInst jest ustawiony dla niektórych parametrów represent_as, których procedury bezpłatnego wystąpienia nie powinny być wywoływane.
  • Bity ServerAllocSize są niezerowe, jeśli parametr to [się], [w], lub [w] wskaźnik do wskaźnika lub wskaźnik do wyliczenia16 i zostanie zainicjowany na stosie interpretera serwera, zamiast używać wywołania do I_RpcAllocate. Jeśli wartość niezerowa, ta wartość jest mnożona przez 8, aby uzyskać liczbę bajtów dla parametru. Należy pamiętać, że oznacza to, że co najmniej 8 bajtów jest zawsze przydzielanych do wskaźnika.
  • Bit IsBasetype jest ustawiany dla typów prostych, które są marshalowane przez pętli interpretera głównego –Oif. W szczególności prosty typ z atrybutem zakresu na nim nie jest oflagowany jako typ podstawowy w celu wymuszenia rutynowego marshalingu zakresu za pomocą wysyłania przy użyciu tokenu FC_RANGE.
  • Bit IsByValue jest ustawiany dla typów złożonych wysyłanych według wartości, ale nie jest ustawiana dla typów prostych, niezależnie od tego, czy argument jest wskaźnikiem. Typy złożone, dla których jest ustawiony, to struktury, związki, transmit_as, represent_as, wire_marshal i SAFEARRAY. Ogólnie rzecz biorąc, bit został wprowadzony z korzyścią dla pętli interpretera głównego w interpreterze –Oicf, aby upewnić się, że argumenty nieimple (nazywane argumentami typu złożonego) są prawidłowo wyłuskiwanych. Ten bit nigdy nie był używany w poprzednich wersjach interpretera.