Leer en inglés

Compartir a través de


Punteros (RPC)

Punteros comunes

Un puntero común se define como todo lo que no sea punteros de interfaz y punteros de recuento de bytes.

Hay dos diseños posibles para la descripción:

pointer_type<1> pointer_attributes<1>
simple_type<1> FC_PAD

-o bien-

pointer_type<1> pointer_attributes<1>
offset_to_complex_description<2>

El primer formato se usa si el puntero es un puntero a un tipo simple o a un puntero de cadena no personalizado. El segundo formato se usa para punteros a todos los demás tipos. Los atributos de puntero indican qué diseño de descripción está con la marca FC_SIMPLE_POINTER.

<pointer_type 1> es uno de los siguientes.

Formato de carácter Descripción
FC_RP Puntero de referencia.
FC_UP Puntero único.
FC_FP Puntero completo.
FC_OP Puntero único en una interfaz de objeto.

 

La razón para distinguir FC_OP es semántica: en las interfaces de objeto, se debe liberar un puntero [in,out] antes de desacoplar un nuevo objeto y asignar un nuevo valor de puntero.

<Pointer_attributes 1> puede tener cualquiera de las marcas que se muestran en la tabla siguiente.

Atributo Marca Descripción
01 FC_ALLOCATE_ALL_NODES El puntero forma parte de un esquema de asignación de allocate(all_nodes).
02 FC_DONT_FREE Puntero allocate(dont_free).
04 FC_ALLOCED_ON_STACK Puntero cuyo referencia se asigna en la pila del código auxiliar.
08 FC_SIMPLE_POINTER Puntero a un tipo simple o una cadena no compatible con el tamaño. Esta marca que se establece indica el diseño de la descripción del puntero como el diseño de puntero simple descrito anteriormente; de lo contrario, se indica el formato del descriptor con el desplazamiento.
10 FC_POINTER_DEREF Puntero que se debe desreferenciar antes de controlar el referente del puntero.

 

Los punteros que tienen size_is(), max_is(), length_is(), last_is() o first_is() aplicados a ellos tienen descripciones de cadena de formato idénticas a un puntero a una matriz del tipo adecuado (por ejemplo, una matriz conforme si se aplica size_is(), una matriz variable conforme si se aplica size_is() y length_is).

Punteros de interfaz

Una cadena de formato de puntero de interfaz de objeto tiene uno de dos formatos, en función de si el compilador conoce el IID correspondiente.

Un puntero de interfaz con una constante IID tiene la siguiente descripción:

FC_IP FC_CONSTANT_IID 
iid<16>

La parte iid<16> es el IID real para el puntero de interfaz. El iid se escribe en la cadena de formato en un formato idéntico a la estructura de datos GUID: long, short, short, char [8].

La descripción de un puntero de interfaz con iid_is() aplicado es:

FC_IP FC_PAD 
iid_description<> 

El iid_description<> es un descriptor de correlación y tiene 4 o 6 bytes en función de si se usa /robust . El valor calculado por la función NdrComputeConformance es el puntero IID.

Punteros de recuento de bytes

Los punteros de recuento de bytes se relacionan con un atributo de optimización especial denominado [byte_count]. Se usan los siguientes formatos:

FC_BYTE_COUNT_POINTER 
simple_type<1>
byte_count_description<> 

–Y–

FC_BYTE_COUNT_POINTER 
FC_PAD
byte_count_description<> 
pointee_description<>

El byte_count_description<> es un descriptor de correlación y tiene 4 o 6 bytes en función de si se usa /robust .

El pointee_description<> es una descripción del tipo de puntero.