Указатели (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> может иметь любой из флагов, показанных в следующей таблице.
Атрибут | Флаг | Описание |
---|---|---|
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 компилятору.
Указатель интерфейса с константой 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 байт в зависимости от того, используется ли /надежный. Значение, вычисляемое функцией 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 байт в зависимости от того, используется ли /надежный.
Pointee_description<> — это описание типа указателя.