Descriptores de parámetros
Como se mencionó anteriormente, existen descriptores de parámetros de estilo –Oi y –Oif .
Descriptores de parámetro –Oi
Los códigos auxiliares totalmente interpretados requieren información adicional para cada uno de los parámetros de una llamada RPC. Las descripciones de parámetros de un procedimiento siguen inmediatamente después de la descripción del procedimiento.
Descriptores de parámetros
El formato de la descripción de un parámetro de tipo simple [in] o devuelto es:
FC_IN_PARAM_BASETYPE
simple_type<1>
-o bien-
FC_RETURN_PARAM_BASETYPE
simple_type<1>
Donde simple_type<1> es el token fc que indica el tipo simple. Los códigos son los siguientes:
4e FC_IN_PARAM_BASETYPE
53 FC_RETURN_PARAM_BASETYPE
Otros –Oi
Descriptores de parámetros
El formato de la descripción de todos los demás tipos de parámetros es:
param_direction<1>
stack_size<1>
type_offset<2>
Donde el campo param_direction<1> para cada una de estas descripciones debe ser uno de los que se muestran en la tabla siguiente.
Hex | Marca | Significado |
---|---|---|
4d | FC_IN_PARAM | Un parámetro in. |
50 | FC_IN_OUT_PARAM | Un parámetro de in/out. |
51 | FC_OUT_PARAM | Parámetro Out. |
52 | FC_RETURN_PARAM | Valor devuelto de un procedimiento. |
4f | FC_IN_PARAM_NO_FREE_INST | En xmit/rep como parámetro para el que no se libera ningún elemento. |
El stack_size<1> es el tamaño del parámetro en la pila, expresado como el número de enteros que ocupa el parámetro en la pila.
Nota
El modo –Oi no se admite en plataformas de 64 bits.
El campo type_offset<2> es el desplazamiento en la tabla de cadenas de formato de tipo, que indica el descriptor de tipo para el argumento.
Descriptores de parámetro –Oif
Hay dos formatos posibles para una descripción de parámetros, uno para tipos base, otro para todos los demás tipos.
Tipos base:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
Otros:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
En ambos stack_offset<2> indica el desplazamiento en la pila de argumentos virtuales, en bytes. Para los tipos base, el tipo de argumento se asigna directamente mediante el carácter de formato correspondiente al tipo. Para otros tipos, el campo type_offset<2> proporciona el desplazamiento en la tabla de cadenas de formato de tipo donde se encuentra el descriptor de tipo para el argumento.
El campo de atributo de parámetro se define de la siguiente manera:
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;
- El bit MustSize solo se establece si el parámetro debe tener el tamaño.
- El bit MustFree se establece si el servidor debe llamar a la rutina NdrFree* del parámetro.
- El bit IsSimpleRef se establece para un parámetro que es un puntero de referencia a cualquier otro puntero que no sea otro, y que no tiene atributos de asignación. Para este tipo, el campo type_offset de<> descripción del parámetro, excepto un puntero de referencia a un tipo base, proporciona el desplazamiento al tipo del referente; el puntero de referencia simplemente se omite.
- El bit IsDontCallFreeInst se establece para determinados parámetros de represent_as cuyas rutinas de instancia libre no deben llamarse.
- Los bits ServerAllocSize son distintos de cero si el parámetro es [out], [in] o [in,out] puntero al puntero o puntero a enum16 y se inicializará en la pila del intérprete del servidor, en lugar de usar una llamada a I_RpcAllocate. Si no es cero, este valor se multiplica por 8 para obtener el número de bytes del parámetro. Tenga en cuenta que hacerlo significa que siempre se asignan al menos 8 bytes para un puntero.
- El bit IsBasetype se establece para tipos simples que se serializa mediante el bucle principal del intérprete –Oif . En concreto, un tipo simple con un atributo de rango en él no se marca como un tipo base para forzar la serialización de rutinas de rango a través de la distribución mediante un token de FC_RANGE.
- El bit IsByValue se establece para los tipos compuestos que se envían por valor, pero no se establece para tipos simples, independientemente de si el argumento es un puntero. Los tipos compuestos para los que se establece son estructuras, uniones, transmit_as, represent_as, wire_marshal y SAFEARRAY. En general, el bit se introdujo para la ventaja del bucle principal del intérprete en el intérprete –Oicf , para asegurarse de que los argumentos nomples (denominados argumentos de tipo compuesto) se desreferencian correctamente. Este bit nunca se usó en versiones anteriores del intérprete.