Condividi tramite


Descrittori di parametri

Come accennato in precedenza, esistono descrittori di parametri di stile -Oi -Oi e -O if.

Descrittori di parametri –Oi

Gli stub completamente interpretati richiedono informazioni aggiuntive per ognuno dei parametri in una chiamata RPC. Le descrizioni dei parametri di una procedura seguono immediatamente dopo la descrizione della procedura.

simple –Oi

descrittori di parametri

Il formato per la descrizione di un [in] o restituire un parametro di tipo semplice è:

FC_IN_PARAM_BASETYPE 
simple_type<1>

–o–

FC_RETURN_PARAM_BASETYPE 
simple_type<1>

Dove simple_type<1> è il token FC che indica il tipo semplice. I codici sono i seguenti:

4e  FC_IN_PARAM_BASETYPE 
53  FC_RETURN_PARAM_BASETYPE

altro -Oi

descrittori di parametri

Il formato per la descrizione per tutti gli altri tipi di parametro è:

param_direction<1> 
stack_size<1> 
type_offset<2>

Dove il campo param_direction<1> per ognuna di queste descrizioni deve essere uno di quelli illustrati nella tabella seguente.

Malocchio Bandiera Significato
4d FC_IN_PARAM Parametro in .
50 FC_IN_OUT_PARAM Parametro in/out.
51 FC_OUT_PARAM Parametro out.
52 FC_RETURN_PARAM Valore restituito della routine.
4f FC_IN_PARAM_NO_FREE_INST Oggetto in xmit/rep come parametro per il quale non viene effettuato alcun rilascio.

 

Il stack_size<1> è la dimensione del parametro nello stack, espresso come numero di numeri interi occupati dal parametro nello stack.

Nota

La modalità -Oi non è supportata nelle piattaforme a 64 bit.

 

Il campo type_offset<2> è l'offset nella tabella delle stringhe di formato del tipo, che indica il descrittore di tipo per l'argomento.

Descrittori di parametri –Oif

Esistono due formati possibili per una descrizione di parametro, uno per i tipi di base, un altro per tutti gli altri tipi.

Tipi di base:

PARAM_ATTRIBUTES<2> 
stack_offset<2> 
type_format_char<1> 
unused<1>

Altro:

PARAM_ATTRIBUTES<2> 
stack_offset<2> 
type_offset<2>

In entrambi i stack_offset<2> indica l'offset nello stack di argomenti virtuali, in byte. Per i tipi di base, il tipo di argomento viene fornito direttamente dal carattere di formato corrispondente al tipo. Per altri tipi, il campo type_offset<2> restituisce l'offset nella tabella delle stringhe di formato del tipo in cui si trova il descrittore di tipo per l'argomento.

Il campo dell'attributo del parametro è definito nel modo seguente:

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;
  • Il bit MustSize viene impostato solo se il parametro deve essere ridimensionato.
  • Il bit MustFree è impostato se il server deve chiamare la routine NdrFree* del parametro.
  • Il bit IsSimpleRef è impostato per un parametro che è un puntatore di riferimento a qualsiasi altro puntatore diverso da un altro puntatore e che non dispone di attributi allocati. Per un tipo di questo tipo, il campo type_offset<> della descrizione del parametro, ad eccezione di un puntatore di riferimento a un tipo di base, fornisce l'offset al tipo del referenziale; il puntatore di riferimento viene semplicemente ignorato.
  • Il bit di isDontCallFreeInst è impostato per determinati parametri represent_as le cui routine di istanza gratuita non devono essere chiamate.
  • I bit di ServerAllocSize sono diversi da zero se il parametro è [out], [in], o [in,out] puntatore a puntatore o puntatore a enum16 e verrà inizializzato nello stack dell'interprete server, anziché usare una chiamata a I_RpcAllocate. Se diverso da zero, questo valore viene moltiplicato per 8 per ottenere il numero di byte per il parametro . Si noti che in questo modo vengono sempre allocati almeno 8 byte per un puntatore.
  • Il bit isBasetype è impostato per i tipi semplici di cui viene eseguito il marshalling dal ciclo principale -Oif interprete. In particolare, un tipo semplice con un attributo di intervallo su di esso non viene contrassegnato come tipo di base per forzare il marshalling di routine dell'intervallo tramite l'invio tramite un token FC_RANGE.
  • La IsByValue bit viene impostata per i tipi composti inviati per valore, ma non è impostata per i tipi semplici, indipendentemente dal fatto che l'argomento sia un puntatore. I tipi composti per cui è impostato sono strutture, unioni, transmit_as, represent_as, wire_marshal e SAFEARRAY. In generale, il bit è stato introdotto per il vantaggio del ciclo dell'interprete principale nell'interprete –Oicf, per garantire che gli argomenti non disimple (definiti argomenti di tipo composto) vengano dereferenziati correttamente. Questo bit non è mai stato usato nelle versioni precedenti dell'interprete.