The wire_marshal Attribute

The [ wire_marshal] attribute is an IDL-type attribute similar in syntax to [ transmit_as], but providing a more efficient way to marshal data across a network.

You use the [wire_marshal] attribute to specify a data type that will be transmitted in place of the application-specific data type. Each application-specific type has a corresponding transmittable type that defines the wire representation (the representation used on the network).The application-specific type need not be transmittable, but it must be a type that MIDL recognizes. To marshal a type unknown to MIDL, use the ACF attribute [ user_marshal].

Your application-specific type can be a simple, composite, or pointer type. The main restriction is that the type instance must have a fixed, well-defined memory size. If the size of your type instance needs to change, use a pointer field rather than a conformant array. Alternatively, you can define a pointer to the changeable type.

You must supply the routines for sizing, marshaling, and unmarshaling the data as well as freeing the associated memory. The following table describes the four user-supplied routine names. The <type> is the userm-type specified in the [wire_marshal] type definition.

Routine Description
<type>_UserSize Sizes the RPC data buffer before marshaling on the client or server side.
<type>_UserMarshal Marshals the data on the client or server side.
<type>_UserUnmarshal Unmarshals the data on the client or server side.
<type>_UserFree Frees the data on the server side.

 

These programmer-supplied routines are provided by either the client or the server application based on the directional attributes.

If the parameter is [ in] only, the client transmits to the server. The client needs the <type>_UserSize and <type>_UserMarshal functions. The server needs the <type>_UserUnmarshal, and <type>_UserFree functions.

For an [ out]-only parameter, the server transmits to the client. The server needs the <type>_UserSize and <type>_UserMarshal functions, while the client needs the <type>_UserMarshal function.

The user_marshal Attribute

Marshaling Rules for user_marshal and wire_marshal

wire_marshal

user_marshal

NdrGetUserMarshalInfo