Paraméterleírók
Ahogy korábban említettük, –Oi és –Oif stílusparaméter-leírók léteznek.
Az –Oi paraméterleírók
A teljes mértékben értelmezett csonkok további információkat igényelnek az RPC-hívások minden paraméteréhez. Az eljárás paraméterleírásai közvetlenül az eljárás leírása után következnek.
paraméterleírók
Az [] leírásának formátuma vagy egyszerű típusparaméter visszaadása a következő:
FC_IN_PARAM_BASETYPE
simple_type<1>
–vagy–
FC_RETURN_PARAM_BASETYPE
simple_type<1>
Ahol simple_type<1> az egyszerű típust jelző FC-jogkivonat. A kódok a következők:
4e FC_IN_PARAM_BASETYPE
53 FC_RETURN_PARAM_BASETYPE
Egyéb –Oi
paraméterleírók
Az összes többi paramétertípus leírásának formátuma a következő:
param_direction<1>
stack_size<1>
type_offset<2>
Ahol az egyes leírások param_direction<1> mezőnek az alábbi táblázatban láthatóak egyikének kell lennie.
Rontás | Zászló | Jelentés |
---|---|---|
4d | FC_IN_PARAM | Egy in paraméter. |
50 | FC_IN_OUT_PARAM | Egy be- és kimenő paraméter. |
51 | FC_OUT_PARAM | Egy kimenő paraméter. |
52 | FC_RETURN_PARAM | Egy eljárás visszaadott értéke. |
4f | FC_IN_PARAM_NO_FREE_INST | Egy xmit/rep paraméter, amelynek nincs felszabadítása. |
Az stack_size<1> a verem paraméterének mérete, a paraméter által a veremen elfoglalt egész számok számában kifejezve.
Jegyzet
Az –Oi mód nem támogatott a 64 bites platformokon.
A type_offset<2> mező a típusformátumú sztringtábla eltolása, amely az argumentum típusleírójának jelölését jelzi.
Az –Oif paraméterleírók
A paraméterek leírásának két lehetséges formátuma van, az egyik az alaptípusokhoz, a másik az összes többi típushoz.
Alaptípusok:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
Más:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
Mindkét stack_offset<2> a virtuális argumentumverem eltolását jelzi bájtban. Alaptípusok esetén az argumentumtípust közvetlenül a típusnak megfelelő formátum karakter adja meg. Más típusok esetén a type_offset<2> mező eltolást ad abban a típusformátumú sztringtáblában, ahol az argumentum típusleírója található.
A paraméterattribútum mező a következőképpen van definiálva:
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;
- A MustSize bit csak akkor van beállítva, ha a paraméternek méretezhetőnek kell lennie.
- A MustFree bit akkor van beállítva, ha a kiszolgálónak meg kell hívnia a paraméter NdrFree* rutinját.
- Az IsSimpleRef bit egy olyan paraméterhez van beállítva, amely egy hivatkozásmutató más mutatótól eltérőre, és amely nem rendelkezik lefoglalási attribútumokkal. Ilyen típus esetén a paraméter leírásának type_offset<> mezője– az alaptípusra mutató hivatkozás kivételével – eltolást biztosít a hivatkozási típushoz; a referenciamutató egyszerűen ki van hagyva.
- Az IsDontCallFreeInst bit olyan represent_as paraméterekhez van beállítva, amelyeknek az ingyenes példányok rutinjait nem szabad meghívni.
- A ServerAllocSize bitek nem adhatók meg, ha a paraméter [ki], [], vagy [be,kifelé mutató] mutatót vagy enum16-ra mutató mutatót, és a kiszolgáló értelmezőjének veremén inicializálódik, és nem a I_RpcAllocatehívását használja. Ha nem, akkor ez az érték 8-tal megszorozva jelenik meg a paraméter bájtjainak számához. Vegye figyelembe, hogy ez azt jelenti, hogy a mutatóhoz mindig legalább 8 bájt van lefoglalva.
- Az IsBasetype bit olyan egyszerű típusokhoz van beállítva, amelyeket a fő –Oif értelmező hurok hoz létre. A tartományattribútummal rendelkező egyszerű típus nem lesz alaptípusként megjelölve annak érdekében, hogy a tartomány rutinszerű marsallálását kényszerítse ki egy FC_RANGE jogkivonat használatával.
- Az IsByValue bit érték szerint küldött összetett típusokhoz van beállítva, de az egyszerű típusok esetében nincs beállítva, függetlenül attól, hogy az argumentum mutató-e. Az összetett típusok, amelyekhez be van állítva, struktúrák, uniók, transmit_as, represent_as, wire_marshal és SAFEARRAY. A bitet általában a –Oicf értelmező fő értelmezőhurok javára vezették be, hogy a nem egybesimuló argumentumok (más néven összetett típusú argumentumok) megfelelően legyenek elhatárolva. Ezt a bitet soha nem használták az értelmező korábbi verzióiban.