Указатели (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.