type_UserMarshal 函数

<类型>_UserMarshal 函数是 [wire_marshal] 和 [user_marshal] 属性的帮助程序函数。 存根调用此函数以封送客户端或服务器端的数据。 函数定义为:

unsigned char __RPC_FAR * __RPC_USER  <type>_UserMarshal(
    unsigned long __RPC_FAR * pFlags,
    unsigned char __RPC_FAR * pBuffer,
    <type>  __RPC_FAR *       pMyObj);

函数名称中的 <类型> 表示在 [wire_marshal] 中指定的用户类型或 [user_marshal] 类型定义。 当与 [user_marshal] 属性一起使用时,此类型可能不可传输,甚至可能为 MIDL 编译器未知的类型。 线路类型名称(可传输类型的名称)未在函数原型中使用。 但是,请注意,线路类型为 OSF DCE 指定的数据定义线路布局。

pFlags 参数是指向无符号长标志字段的指针。 标志的上一字包含 OSF DCE 定义的 NDR 数据表示标志,用于浮点、字节顺序和字符表示形式。 下一个单词包含 COM 通道定义的封送上下文标志。 “type_UserSize函数”中介绍了字段内标志的确切布局。

pBuffer 参数是当前缓冲区指针。 此指针可能在条目上对齐或不对齐。 <类型>_UserMarshal 函数应适当对齐缓冲区指针,封送数据,并返回新的缓冲区位置,这是封送对象后第一个字节的地址。 请记住,线路类型规范确定缓冲区中数据的实际布局。

pMyObj 参数是指向用户类型对象的指针。

返回值是新的缓冲区位置,该位置是未划分对象之后的第一个字节的地址。

当错误地计算数据大小并尝试封送数据超过预期时,可能会发生缓冲区溢出。 应小心避免这种情况。 可以使用 <类型>_UserMarshal 返回的指针来检查它。 否则,在以后,NDR 引擎可能会引发缓冲区溢出异常。

必须在本地捕获和处理异常,不允许异常传播调用堆栈。

封送user_marshal和wire_marshal规则

wire_marshal

user_marshal