参数描述符

如前所述, 存在 –Oi–Oif 样式参数描述符。

–Oi 参数描述符

完全解释的存根需要 RPC 调用中的每个参数的其他信息。 过程的参数说明紧跟在过程说明之后。

简单 –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 标志 含义
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> 是堆栈上参数的大小,以参数在堆栈上占用的整数数表示。

注意

64 位平台不支持 –Oi 模式。

 

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 位。
  • 如果服务器必须调用参数的 NdrFree* 例程,则设置 MustFree 位。
  • IsSimpleRef 位是为参数设置的,该参数是指向除其他指针以外的任何对象的引用指针,并且没有分配属性。 对于此类类型,参数说明的type_offset<> 字段(指向基类型的引用指针除外)提供引用类型的偏移量;直接跳过引用指针。
  • IsDontCallFreeInst 位是为不应调用其自由实例例程的某些represent_as参数设置的。
  • 如果参数为 [out]、[in]或 [in,out] 指向指针的指针或指向 enum16 的指针,则 ServerAllocSize 位为非零值,并且将在服务器解释器的堆栈上初始化,而不是使用对 I_RpcAllocate 的调用。 如果为非零,则此值乘以 8,以获取参数的字节数。 请注意,这样做意味着始终至少为指针分配 8 个字节。
  • IsBasetype 位是为由 main –Oif 解释器循环封送的简单类型设置的。 具体而言,具有 range 属性的简单类型不会标记为基类型,以便使用FC_RANGE令牌通过调度强制范围例程封送处理。
  • IsByValue 位是为按值发送的复合类型设置的,但不会为简单类型设置,无论参数是否为指针。 为其设置它的复合类型包括结构、联合、 transmit_asrepresent_aswire_marshal 和 SAFEARRAY。 一般情况下,引入 位是为了在 –Oicf 解释器中main解释器循环的好处,以确保正确取消引用 (称为复合类型参数) 的非简单参数。 以前版本的解释器中从未使用此位。