The wire_marshal Attribute
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.
|<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