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


Дескрипторы параметров

Как упоминалось ранее, существуют дескрипторы параметров стилей –Oi и –Oif .

Дескрипторы параметра –Oi

Полностью интерпретируемые заглушки требуют дополнительных сведений о каждом из параметров в вызове RPC. Описания параметров процедуры следуют сразу после описания процедуры.

Simple –Oi

Дескрипторы параметров

Формат описания параметра простого типа [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, чтобы обеспечить правильное разыменование аргументов неимпляемых (называемых аргументами составного типа). Этот бит никогда не использовался в предыдущих версиях интерпретатора.