user_marshal 属性

[ user_marshal] 属性是 ACF 类型的属性,语法类似于 [ represent_as]。 与 IDL 属性 [ wire_marshal] 一样,它提供了一种更高效的方式来跨网络封送数据。 [ user_marshal] 作为 ACF 属性,可用于封送 MIDL 未知的自定义数据类型。 每个特定于应用程序的类型都有一个相应的可传输类型,用于定义线路表示形式。

特定于应用程序的类型可以是简单类型、复合类型或指针类型。 main限制是类型实例必须具有固定且妥善定义的内存大小。 如果需要更改类型实例的大小,请使用指针字段而不是一致的数组。 或者,可以定义指向可更改类型的指针。

[wire_marshal] 属性一样,为大小调整、封送、取消封送和释放传递提供例程。 下表描述了四个用户提供的例程名称。 类型<>是在 [user_marshal]类型定义中指定的用户类型。

例程所返回的值 说明
<type>_UserSize 在客户端或服务器端封送之前调整 RPC 数据缓冲区的大小。
<type>_UserMarshal 封送客户端或服务器端的数据。
<type>_UserUnmarshal 取消对客户端或服务器端的数据进行封送。
<type>_UserFree 释放服务器端的数据。

 

这些用户提供的例程由客户端或服务器应用程序基于方向属性提供。

如果参数仅为 [ in],则客户端将传输到服务器。 客户端需要 <type>_UserSize<type>_UserMarshal 函数。 服务器需要 <type>_UserUnmarshal<type>_UserFree 函数。

对于 [ out]-only 参数,服务器将传输到客户端。 服务器需要 <type>_UserSize<type>_UserMarshal 函数,而客户端需要 <type>_UserMarshal 函数。

wire_marshal 属性

用户封送和wire_marshal的封送规则

user_marshal

wire_marshal

NdrGetUserMarshalInfo