Parameterdeskriptoren
Wie bereits erwähnt, sind –Oi und –Oif Formatparameterdeskriptoren vorhanden.
Die Parameterdeskriptoren –Oi
Voll 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 der Rückgabe eines 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
Other –Oi
Parameterdeskriptoren
Das Format für die Beschreibung für alle anderen Parametertypen lautet:
param_direction<1>
stack_size<1>
type_offset<2>
Wenn das Feld param_direction<1> für jede dieser Beschreibungen eine der in der folgenden Tabelle aufgeführten Felder sein muss.
Fluch | Flagge | Bedeutung |
---|---|---|
4d | FC_IN_PARAM | Ein in-Parameter. |
50 | FC_IN_OUT_PARAM | Ein In/Out-Parameter. |
51 | FC_OUT_PARAM | Ein Ausgabeparameter. |
52 | FC_RETURN_PARAM | Ein Prozedurrückgabewert. |
4f | FC_IN_PARAM_NO_FREE_INST | Ein in "xmit/rep" als Parameter, für den keine Freihandzugriffe vorgenommen werden. |
Die stack_size<1> ist die Größe des Parameters auf dem Stapel, ausgedrückt als die Anzahl der ganzzahligen Zahlen, die der Parameter im Stapel belegt.
Anmerkung
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, eine für Basistypen, eine für alle anderen Typen.
Basistypen:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
Andere:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
In beiden stack_offset<2> gibt den Offset auf dem virtuellen Argumentstapel in Byte 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 Parameter-Attributfeld wird 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;
- Die MustSize Bit wird nur festgelegt, wenn der Parameter angepasst werden muss.
- Die MustFree Bit wird festgelegt, wenn der Server die NdrFree*-Routine des Parameters aufrufen muss.
- Das IsSimpleRef Bit wird für einen Parameter festgelegt, der einen Verweiszeiger auf einen anderen Zeiger als einen anderen Zeiger darstellt und keine Zuweisungsattribute aufweist. Für einen solchen Typ stellt das type_offset<> Feld der Parameterbeschreibung, mit Ausnahme eines Referenzzeigers auf einen Basistyp, den Offset für den Typ des Referents bereit; der Verweiszeiger wird einfach übersprungen.
- Die IsDontCallFreeInst Bit wird für bestimmte represent_as Parameter festgelegt, deren freie Instanzroutinen nicht aufgerufen werden sollten.
- Die ServerAllocSize- Bits sind nicht null, wenn der Parameter [out], [in], oder [in,out] Zeiger auf Zeiger oder Zeiger auf enum16 ist und nicht im Stapel des Serverdolmetschers initialisiert wird, anstatt einen Aufruf von I_RpcAllocatezu verwenden. Wenn "nonzero" ist, wird dieser Wert mit 8 multipliziert, um die Anzahl der Bytes für den Parameter abzurufen. Beachten Sie, dass dies bedeutet, dass mindestens 8 Bytes für einen Zeiger immer zugewiesen werden.
- Das IsBasetype Bit wird für einfache Typen festgelegt, die von der Haupt--Oif-Interpreterschleife gemarstet werden. Insbesondere wird ein einfacher Typ mit einem Bereichsattribut nicht als Basistyp gekennzeichnet, um die Range routine marshaling durch dispatching mithilfe eines FC_RANGE-Tokens zu erzwingen.
- Die IsByValue Bit wird für zusammengesetzte Typen festgelegt, die nach Wert gesendet werden, jedoch nicht für einfache Typen festgelegt, unabhängig davon, ob das Argument ein Zeiger ist. Die zusammengesetzten Typen, für die sie festgelegt ist, sind Strukturen, Gewerkschaften, transmit_as, represent_as, wire_marshal und SAFEARRAY. Im Allgemeinen wurde das Bit für den Vorteil der Hauptdolmetscherschleife in der -Oicf Interpreter eingeführt, um sicherzustellen, dass die nicht einfachen Argumente (als Zusammengesetzte Typargumente bezeichnet) ordnungsgemäß abgeleitet werden. Dieses Bit wurde nie in früheren Versionen des Dolmetschers verwendet.