参数描述符
如前所述, 存在 –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 | 标志 | 含义 |
---|---|---|
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_as、 represent_as、 wire_marshal 和 SAFEARRAY。 一般情况下,引入 位是为了在 –Oicf 解释器中main解释器循环的好处,以确保正确取消引用 (称为复合类型参数) 的非简单参数。 以前版本的解释器中从未使用此位。