Compartir a través de


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.

Simple –Oi

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.