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


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

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

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

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

Simple –Oi

дескрипторов параметров

Формат описания [в] или возвращаемого простого параметра типа:

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

Other –Oi

дескрипторов параметров

Формат описания для всех других типов параметров:

param_direction<1> 
stack_size<1> 
type_offset<2>

Где поле param_direction<1> для каждого из этих описаний должно быть одним из этих описаний, показанных в следующей таблице.

Зачаровывать Флаг Значение
4d FC_IN_PARAM Параметр in.
50 FC_IN_OUT_PARAM Параметр in/out.
51 FC_OUT_PARAM Параметр out.
52 FC_RETURN_PARAM Возвращаемое значение процедуры.
4f FC_IN_PARAM_NO_FREE_INST В 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 являются ненулевыми, если параметр равен [из], [в], или [in,out] указатель на указатель на указатель или указатель на перечисление16, и будет инициализирован на стек интерпретатора сервера, а не с помощью вызова I_RpcAllocate. Если значение не является ненулевой, это значение умножается на 8, чтобы получить количество байтов для параметра. Обратите внимание, что это означает, что для указателя всегда выделяется по крайней мере 8 байт.
  • Бит IsBasetype задан для простых типов, которые маршалируются основным циклом интерпретатора –Oif. В частности, простой тип с атрибутом диапазона на нем не помечается как базовый тип, чтобы принудительно выполнить маршалинг диапазона с помощью маркера FC_RANGE.
  • Бит IsByValue задан для составных типов, отправляемых по значению, но не задан для простых типов независимо от того, является ли аргумент указателем. Составные типы, для которых она устанавливается, являются структурами, объединениями, transmit_as, represent_as, wire_marshal и SAFEARRAY. Как правило, бит был введен для преимущества основного цикла интерпретатора в интерпретаторе –Oicf интерпретатора, чтобы убедиться, что аргументы неимплированных типов (называемые аргументами составного типа) правильно разоменовываются. Этот бит никогда не использовался в предыдущих версиях интерпретатора.