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