Freigeben über


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.

Simple –Oi

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.