Punteros (RPC)
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).
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.
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.