Condividi tramite


Descrittori di parametri

Come accennato in precedenza, esistono descrittori di parametri di stile –Oi e -Oif .

Descrittori dei parametri –Oi

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

Simple –Oi

Descrittori di parametri

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

FC_IN_PARAM_BASETYPE 
simple_type<1>

–oppure–

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 parametri è:

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 visualizzati nella tabella seguente.

Hex Flag 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 dalla routine.
4f FC_IN_PARAM_NO_FREE_INST Oggetto in xmit/rep come parametro per cui non viene effettuato alcun libero.

 

Il stack_size<1> è la dimensione del parametro nello stack, espresso come numero di interi occupa lo stack.

Nota

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

 

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

Descrittori del parametro –Oif

Esistono due formati possibili per una descrizione dei parametri, 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 assegnato direttamente dal carattere di formato corrispondente al tipo. Per altri tipi, il campo type_offset<2> fornisce l'offset nella tabella stringa di formato del tipo in cui si trova il descrittore di tipo per l'argomento.

Il campo dell'attributo del parametro è definito come segue:

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 elemento diverso da un altro puntatore e che non dispone di attributi allocati. Per tale tipo, il campo di type_offset<> della descrizione del parametro, ad eccezione di un puntatore di riferimento a un tipo di base, fornisce l'offset al tipo di riferimento. Il puntatore di riferimento viene semplicemente ignorato.
  • Il bit IsDontCallFreeInst è impostato per determinati parametri represent_as le cui routine di istanza gratuita non devono essere chiamate.
  • I bit ServerAllocSize non sono zero se il parametro è [out], [in]o [in,out] puntatore a puntatore o puntatore a enum16 e verrà inizializzato nello stack dell'interprete del server, anziché usare una chiamata a I_RpcAllocate. Se il valore non è zero, questo valore viene moltiplicato per 8 per ottenere il numero di byte per il parametro. Si noti che in questo modo significa che almeno 8 byte vengono sempre allocati per un puntatore.
  • Il bit IsBasetype è impostato per i tipi semplici che vengono sottoposti a marshalling dal ciclo dell'interprete principale -Oif . In particolare, un tipo semplice con un attributo range su di esso non viene contrassegnato come tipo di base per forzare il marshalling della routine di intervallo tramite l'invio tramite un token di FC_RANGE.
  • Il bit IsByValue è impostato per i tipi composti inviati per valore, ma non è impostato per tipi semplici, indipendentemente dal fatto che l'argomento sia un puntatore. I tipi composti per i quali è 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 nonsimple (definiti argomenti di tipo composto) siano dereferenziati correttamente. Questo bit non è mai stato usato nelle versioni precedenti dell'interprete.