Прочитать на английском

Поделиться через


Указатели (RPC)

Общие указатели

Общий указатель определяется как все, кроме указателей интерфейса и указателей количества байтов.

Существует два возможных макета для описания:

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

–или–

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

Первый формат используется, если указатель является указателем на простой тип или неразверизованным строковым указателем. Второй формат используется для указателей на все остальные типы. Атрибуты указателя указывают макет описания с флагом FC_SIMPLE_POINTER.

<pointer_type 1> является одним из следующих.

Формат символа Описание
FC_RP Указатель на ссылку.
FC_UP Уникальный указатель.
FC_FP Полный указатель.
FC_OP Уникальный указатель в интерфейсе объекта.

 

Причина различения FC_OP заключается в семантике: в интерфейсах объектов указатель [in,out] должен быть освобожден перед расшиванием нового объекта и назначением нового значения указателя.

<Pointer_attributes 1> может иметь любой из флагов, показанных в следующей таблице.

attribute Flag Описание
01 FC_ALLOCATE_ALL_NODES Указатель является частью схемы выделения (all_nodes).
02 FC_DONT_FREE Указатель на выделение (dont_free).
04 FC_ALLOCED_ON_STACK Указатель, референт которого выделен в стеке заглушки.
08 FC_SIMPLE_POINTER Указатель на простой тип или несмеченную соответствующую строку. Этот установленный флаг указывает макет описания указателя как простой макет указателя, описанный выше, в противном случае указывается формат дескриптора со смещением.
10 FC_POINTER_DEREF Указатель, который необходимо разыменовыть перед обработкой ссылки указателя.

 

Указатели, к которым применены size_is(), max_is(), length_is(), last_is() и (или) first_is(), имеют описания строк формата, идентичные указателю на массив соответствующего типа (например, соответствующий массив, если применяется size_is(), соответствующий изменяющийся массив, если применяются size_is() и length_is).

Указатели интерфейса

Строка формата указателя интерфейса объекта имеет один из двух форматов в зависимости от того, известен ли компилятору соответствующий КОД.

Указатель интерфейса с константой IID имеет следующее описание:

FC_IP FC_CONSTANT_IID 
iid<16>

Часть iid<16> является фактическим IID для указателя интерфейса. Iid записывается в строку формата в формате, идентичном структуре данных GUID: long, short, short, char [8].

Описание указателя интерфейса с примененным к нему iid_is() будет следующим:

FC_IP FC_PAD 
iid_description<> 

Iid_description<> является дескриптором корреляции и имеет 4 или 6 байт в зависимости от того, используется ли параметр /robust . Значение, вычисленное функцией NdrComputeConformance , является указателем IID.

Указатели числа байтов

Указатели числа байтов связаны со специальным атрибутом оптимизации с именем [byte_count]. Используются следующие форматы:

FC_BYTE_COUNT_POINTER 
simple_type<1>
byte_count_description<> 

–И–

FC_BYTE_COUNT_POINTER 
FC_PAD
byte_count_description<> 
pointee_description<>

Byte_count_description<> является дескриптором корреляции и имеет 4 или 6 байт в зависимости от того, используется ли параметр /robust .

Pointee_description<> — это описание типа pointee.