Parameterdeskriptoren
Wie bereits erwähnt, sind die Formatparameterdeskriptoren –Oi und –Oif vorhanden.
Die Parameterdeskriptoren –Oi
Vollständig interpretierte Stubs erfordern zusätzliche Informationen für jeden Parameter in einem RPC-Aufruf. Die Parameterbeschreibungen einer Prozedur folgen unmittelbar nach der Beschreibung der Prozedur.
Parameterdeskriptoren
Das Format für die Beschreibung eines [in]- oder rückgabe einfachen Typparameters lautet:
FC_IN_PARAM_BASETYPE
simple_type<1>
– oder –
FC_RETURN_PARAM_BASETYPE
simple_type<1>
Dabei ist simple_type<1> das FC-Token, das den einfachen Typ angibt. Die Codes sind wie folgt:
4e FC_IN_PARAM_BASETYPE
53 FC_RETURN_PARAM_BASETYPE
Sonstiges –Oi
Parameterdeskriptoren
Das Format für die Beschreibung für alle anderen Parametertypen lautet:
param_direction<1>
stack_size<1>
type_offset<2>
Dabei muss das Feld param_direction<1> für jede dieser Beschreibungen eines der in der folgenden Tabelle gezeigten Sein.
Hex | Flag | Bedeutung |
---|---|---|
4d | FC_IN_PARAM | Ein in-Parameter. |
50 | FC_IN_OUT_PARAM | Ein in/out-Parameter. |
51 | FC_OUT_PARAM | Ein out-Parameter. |
52 | FC_RETURN_PARAM | Ein Prozedurrückgabewert. |
4f | FC_IN_PARAM_NO_FREE_INST | Ein in xmit/rep als Parameter, für den keine Freigabe erfolgt. |
Die stack_size<1> ist die Größe des Parameters auf dem Stapel, ausgedrückt als Anzahl von ganzen Zahlen, die der Parameter auf dem Stapel belegt.
Hinweis
Der -Oi-Modus wird auf 64-Bit-Plattformen nicht unterstützt.
Das Feld type_offset<2> ist der Offset in der Typformatzeichenfolgentabelle, der den Typdeskriptor für das Argument angibt.
Die Parameterdeskriptoren –Oif
Es gibt zwei mögliche Formate für eine Parameterbeschreibung: eines für Basistypen und eins für alle anderen Typen.
Basistypen:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
Sonstiges:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
In beiden stack_offset<2> den Offset auf dem virtuellen Argumentstapel in Bytes an. Bei Basistypen wird der Argumenttyp direkt durch das Formatzeichen angegeben, das dem Typ entspricht. Bei anderen Typen gibt das Feld type_offset<2> den Offset in der Typformatzeichenfolgentabelle an, in der sich der Typdeskriptor für das Argument befindet.
Das Parameterattributefeld ist wie folgt definiert:
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;
- Das MustSize-Bit wird nur festgelegt, wenn der Parameter dimensioniert werden muss.
- Das MustFree-Bit wird festgelegt, wenn der Server die NdrFree*-Routine des Parameters aufrufen muss.
- Das IsSimpleRef-Bit wird für einen Parameter festgelegt, der ein Verweiszeiger auf einen anderen Zeiger als einen anderen Zeiger ist und über keine Zuordnungsattribute verfügt. Bei einem solchen Typ stellt das type_offset<> Feld der Parameterbeschreibung mit Ausnahme eines Verweiszeigers auf einen Basistyp den Offset zum Typ des Referents bereit. Der Verweiszeiger wird einfach übersprungen.
- Das IsDontCallFreeInst-Bit wird für bestimmte represent_as Parameter festgelegt, deren freie instance Routinen nicht aufgerufen werden sollen.
- Die ServerAllocSize-Bits sind ungleich null, wenn der Parameter [out], [in] oder [in,out] zeiger auf zeiger oder zeiger auf enum16 ist und im Stapel des Serverinterprets initialisiert wird, anstatt einen Aufruf von I_RpcAllocate zu verwenden. Bei ungleich null wird dieser Wert mit 8 multipliziert, um die Anzahl der Bytes für den Parameter abzurufen. Beachten Sie, dass einem Zeiger immer mindestens 8 Byte zugeordnet sind.
- Das IsBasetype-Bit wird für einfache Typen festgelegt, die von der Standard -Oif-Interpreterschleife gemarshallt werden. Insbesondere wird ein einfacher Typ mit einem Bereichsattribut nicht als Basistyp gekennzeichnet, um das Bereichsroutinemarsing durch die Verteilung mithilfe eines FC_RANGE Tokens zu erzwingen.
- Das IsByValue-Bit wird für Verbundtypen festgelegt, die nach Wert gesendet werden, ist aber nicht für einfache Typen festgelegt, unabhängig davon, ob das Argument ein Zeiger ist. Die zusammengesetzten Typen, für die er festgelegt wird, sind Strukturen, Unions, transmit_as, represent_as, wire_marshal und SAFEARRAY. Im Allgemeinen wurde das Bit zugunsten der Standard Interpreterschleife im -Oicf-Interpreter eingeführt, um sicherzustellen, dass die nicht einfachen Argumente (als Verbundargumente bezeichnet) ordnungsgemäß abgeleitet werden. Dieses Bit wurde in früheren Versionen des Interpreters nie verwendet.