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.
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.