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


Указатели (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<> — это описание типа указателя.