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.
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.