wire_marshal (atributo)
El atributo [wire_marshal] especifica un tipo de datos que se usará para la transmisión (el tipo de conexión) en lugar de un tipo de datos específico de la aplicación (el tipo userm).
typedef [wire_marshal(wire_type)] type-specifier userm-type;
unsigned long __RPC_USER < userm-type >_UserSize(
unsigned long __RPC_FAR *pFlags,
unsigned long StartingSize,
< userm-type > __RPC_FAR * pUser_typeObject );
unsigned char __RPC_FAR * __RPC_USER < userm-type >_UserMarshal(
unsigned long __RPC_FAR * pFlags,
unsigned char __RPC_FAR * Buffer,
< userm-type > __RPC_FAR * pUser_typeObject);
unsigned char __RPC_FAR * __RPC_USER < userm-type >_UserUnmarshal(
unsigned long __RPC_FAR * pFlags,
unsigned char __RPC_FAR * Buffer,
< userm-type > __RPC_FAR * pUser_typeObject);
void __RPC_USER < userm-type >_UserFree(
unsigned long __RPC_FAR * pFlags,
< userm-type > __RPC_FAR * pUser_typeObject);
Parámetros
-
tipo de cable
-
Especifica el tipo de datos de transferencia con nombre que se transfiere realmente entre el cliente y el servidor. El tipo de conexión debe ser un tipo base MIDL, un tipo predefinido o un identificador de tipo de un tipo que se pueda transmitir a través de la red.
-
type-specifier
-
Tipo para el que userm-type se convertirá en un alias.
-
userm-type
-
Especifica el identificador del tipo de datos de usuario que se va a serializar. Puede ser cualquier tipo, tal como lo proporciona el especificador de tipos, siempre y cuando tenga un tamaño bien definido. El tipo userm no debe transmitirse, pero debe ser un tipo conocido para el compilador MIDL.
-
pFlags
-
Especifica un puntero a un campo de marca ( longsin signo). La palabra de orden alto especifica marcas de representación de datos NDR definidas por DCE para punto flotante, big-o little-endian y representación de caracteres. La palabra de orden bajo especifica una marca de contexto de cálculo de referencias. El diseño exacto de las marcas se describe en La función type_UserSize.
-
StartingSize
-
Especifica el tamaño actual del búfer (desplazamiento) antes de ajustar el tamaño del objeto.
-
pUser_typeObject
-
Especifica un puntero a un objeto de userm_type.
-
Buffer
-
Especifica el puntero del búfer actual.
Observaciones
Cada tipo de datos específico de la aplicación, userm-type, tiene una correspondencia uno a uno con un tipo de cable que define la representación de conexión del tipo. Debe proporcionar rutinas para ajustar el tamaño de los datos para serializar, serializar y desmarizar los datos y liberar memoria. Tenga en cuenta que si hay tipos incrustados en los datos que también se definen con [wire_marshal] o [user_marshal], también debe administrar el mantenimiento de esos tipos incrustados. Para obtener más información sobre estas rutinas, vea El atributo wire_marshal.
La implementación debe seguir las reglas de serialización según la especificación OSF-DCE. Puede encontrar detalles sobre la sintaxis de transferencia de NDR en https://www.opengroup.org/onlinepubs/9629399/chap14.htm. No se recomienda usar [wire_marshal] si no está familiarizado con el protocolo de conexión.
El tipo de cable no puede ser un puntero de interfaz ni un puntero completo. El tipo de cable debe tener un tamaño de memoria bien definido. Consulte Serialización de reglas para user_marshal y wire_marshal para obtener más información sobre cómo serializar un tipo de cable determinado.
El tipo userm no debe ser un puntero de interfaz porque se pueden serializar directamente. Si el tipo de usuario es un puntero completo, debe administrar el alias usted mismo.
No se puede usar el atributo [wire_marshal] con el atributo [allocate], ya sea directa o indirectamente, ya que el motor NDR no controla la asignación de memoria para el tipo transmitido.
Ejemplos
typedef unsigned long _FOUR_BYTE_DATA;
typedef struct _TWO_X_TWO_BYTE_DATA
{
unsigned short low;
unsigned short high;
} TWO_X_TWO_BYTE_DATA;
typedef [wire_marshal(TWO_X_TWO_BYTE_DATA)]
_FOUR_BYTE_DATA FOUR_BYTE_DATA;
//Marshaling functions:
// Calculate size that converted data will
// require in the buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserSize(
ULONG __RPC_FAR * pulFlags,
ULONG __RPC_FAR ulStartingSize,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Copy FOUR_BYTE_DATA into buffer as
// TWO_X_TWO_BYTE_DATA
unsigned long __RPC_USER FOUR_BYTE_DATA_UserMarshal(
ULONG __RPC_FAR *pulFlags,
char __RPC_FAR * pBufferStart,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Recreate FOUR_BYTE_DATA from TWO_X_TWO_BYTE_DATA in buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserUnmarshal(
ULONG __RPC_FAR * pulFlags,
char __RPC_FAR * pBufferStart,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Nothing to do here as the engine frees the top
// node and FOUR_BYTE_DATA is a flat data type.
void __RPC_USER FOUR_BYTE_DATA_UserFree(
ULONG __RPC_FAR * pulFlags,
FOUR_BYTE_DATA __RPC_FAR * pul
);
Vea también