Маршал пользователя
Маршал пользователя имеет строку формата, аналогичную 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 равным нулю.