Дескрипторы параметров
Как упоминалось ранее, существуют дескрипторы параметров стилей –Oi и –Oif .
Дескрипторы параметра –Oi
Полностью интерпретируемые заглушки требуют дополнительных сведений о каждом из параметров в вызове RPC. Описания параметров процедуры следуют сразу после описания процедуры.
Дескрипторы параметров
Формат описания параметра простого типа [in] или возвращаемого простого типа:
FC_IN_PARAM_BASETYPE
simple_type<1>
–или–
FC_RETURN_PARAM_BASETYPE
simple_type<1>
Где simple_type<1> — маркер FC, указывающий простой тип. Ниже приведены коды.
4e FC_IN_PARAM_BASETYPE
53 FC_RETURN_PARAM_BASETYPE
Другое –Oi
Дескрипторы параметров
Описание всех остальных типов параметров имеет следующий формат:
param_direction<1>
stack_size<1>
type_offset<2>
Где поле param_direction<1> для каждого из этих описаний должно быть одним из указанных в следующей таблице.
Hex | Flag | Значение |
---|---|---|
4d | FC_IN_PARAM | Параметр in. |
50 | FC_IN_OUT_PARAM | Параметр in/out. |
51 | FC_OUT_PARAM | Выходной параметр. |
52 | FC_RETURN_PARAM | Возвращаемое значение процедуры. |
4f | FC_IN_PARAM_NO_FREE_INST | Объект in xmit/rep в качестве параметра, для которого не выполняется освобождение. |
Stack_size<1> — это размер параметра в стеке, выраженный в виде количества целых чисел, занимаемого параметром в стеке.
Примечание
Режим –Oi не поддерживается на 64-разрядных платформах.
Поле type_offset<2> — это смещение в таблице строк формата типов, указывающее дескриптор типа для аргумента.
Дескрипторы параметра –Oif
Существует два возможных формата описания параметра: один для базовых типов, другой для всех остальных типов.
Базовые типы:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
Другие возможности:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
В обоих stack_offset<2> указывает смещение в виртуальном стеке аргументов в байтах. Для базовых типов тип аргумента задается непосредственно символом формата, соответствующим типу. Для других типов поле type_offset<2> дает смещение в таблице строк формата типов, где находится дескриптор типа для аргумента.
Поле атрибута параметра определяется следующим образом:
typedef struct
{
unsigned short MustSize : 1; // 0x0001
unsigned short MustFree : 1; // 0x0002
unsigned short IsPipe : 1; // 0x0004
unsigned short IsIn : 1; // 0x0008
unsigned short IsOut : 1; // 0x0010
unsigned short IsReturn : 1; // 0x0020
unsigned short IsBasetype : 1; // 0x0040
unsigned short IsByValue : 1; // 0x0080
unsigned short IsSimpleRef : 1; // 0x0100
unsigned short IsDontCallFreeInst : 1; // 0x0200
unsigned short SaveForAsyncFinish : 1; // 0x0400
unsigned short Unused : 2;
unsigned short ServerAllocSize : 3; // 0xe000
} PARAM_ATTRIBUTES, *PPARAM_ATTRIBUTES;
- Бит MustSize задается только в том случае, если параметр должен иметь размер.
- Бит MustFree задается, если сервер должен вызвать подпрограмму NdrFree* параметра.
- Бит IsSimpleRef задается для параметра, который является указателем ссылки на что-либо, кроме другого указателя, и который не имеет атрибутов выделения. Для такого типа поле описания параметра type_offset<> , за исключением указателя ссылки на базовый тип, обеспечивает смещение типа референта; указатель ссылки просто пропускается.
- Бит IsDontCallFreeInst задается для определенных represent_as параметров, процедуры свободных экземпляров которых не должны вызываться.
- Биты ServerAllocSize не являются нулевыми, если параметр имеет значение [out], [in], или [in,out] указатель на указатель или указатель на enum16, и будут инициализированы в стеке интерпретатора сервера, а не с помощью вызова I_RpcAllocate. Если значение не равно нулю, это значение умножается на 8, чтобы получить количество байтов для параметра . Обратите внимание, что это означает, что для указателя всегда выделяется не менее 8 байт.
- Бит IsBasetype задается для простых типов, маршалинг которых выполняется с помощью цикла интерпретатора main –Oif. В частности, простой тип с атрибутом range не помечается как базовый, чтобы принудительно маршалировать диапазон с помощью диспетчеризации с помощью маркера FC_RANGE.
- Бит IsByValue устанавливается для составных типов, отправляемых по значению, но не для простых типов, независимо от того, является ли аргумент указателем. Составные типы, для которых он задан: структуры, объединения, transmit_as, represent_as, wire_marshal и SAFEARRAY. Как правило, бит был введен для преимущества цикла интерпретатора main в интерпретаторе –Oicf, чтобы обеспечить правильное разыменование аргументов неимпляемых (называемых аргументами составного типа). Этот бит никогда не использовался в предыдущих версиях интерпретатора.