wire_marshal属性

[wire_marshal] 属性是类似于 [transmit_as] 语法的 IDL 类型属性,但提供了一种更高效的方法,用于跨网络封送数据。

使用 [wire_marshal] 属性指定将传输的数据类型,以代替特定于应用程序的数据类型。 每个特定于应用程序的类型都有一个相应的可传输类型,用于定义线路表示形式(网络上使用的表示形式)。应用程序特定的类型不需要可传输,但它必须是 MIDL 识别的类型。 若要封送 MIDL 未知的类型,请使用 ACF 属性 [user_marshal]。

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

必须提供用于调整大小、封送和取消对数据进行分组以及释放关联内存的例程。 下表描述了四个用户提供的例程名称。 <类型> 是在 [wire_marshal] 类型定义中指定的用户类型。

常规 描述
<类型>_UserSize 在客户端或服务器端封送之前调整 RPC 数据缓冲区的大小。
<类型>_UserMarshal 封送客户端或服务器端的数据。
<类型>_UserUnmarshal 取消对客户端或服务器端的数据进行解封。
<类型>_UserFree 释放服务器端的数据。

 

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

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

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

user_marshal属性

封送user_marshal和wire_marshal规则

wire_marshal

user_marshal

NdrGetUserMarshalInfo