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


Маршал пользователя

Маршал пользователя имеет строку формата, аналогичную transmit_as:

FC_USER_MARSHAL
flags<1>
quadruple_index<2>
user_type_memory_size<2>
transmitted_type_buffer size<2>
offset_to_the_transmitted_type<2>

Флаги<1> байт состоит из верхнего флага и нижнего выравнивания.

Верхние 2 бита флага используются для описания того, определен ли тип провода как уникальный указатель, ссылочный указатель или нет указателя (он не может быть ptr). Для задания и получения флагов определены следующие манифесты:

#define USER_MARSHAL_UNIQUE         0x80
#define USER_MARSHAL_REF            0x40
#define USER_MARSHAL_POINTER        0xc0  /* unique or ref */
#define USER_MARSHAL_IID            0x20  /* JIT compiler only */

Выравнивание слова флага сохраняет выравнивание провода передаваемого типа.

Quadruple_index<2> — это индекс подпрограммы обратного вызова в четыре раза больше функций маршала пользователя. Обычное положение выглядит следующим образом: изменение размера, маршалинг, отмена общения и освобождение подпрограммы.

User_type_memory_size<2> предоставляет размер для конкретного типа пользователя, включая неизвестные типы.

Transmitted_type_buffer_size<2> равно нулю при изменении размера или фактического фиксированного размера. Это оптимизация, которая позволяет MIDL пропускать обратные вызовы при изменении размера буфера, а также при освобождении.

Диапазон

Проверка [диапазона] предоставляет дополнительные средства для проверки аргументов на уровне NDR. Дескриптор [range] имеет следующий формат:

FC_RANGE,   flags_type <1>
low value<4>
high value<4>

Флаги принимают верхний набитый и тип нижнего набитого второго байта. Низкие и высокие значения зависят от типа проверяемой переменной.

Флаги предназначены в качестве средства расширения; компилятор задавал значение nibble равным нулю.