atributo user_marshal
El user_marshal atributo ACF asocia un tipo local con nombre en el idioma de destino (tipo userm) con un tipo de transferencia (tipo de conexión) que se transfiere entre el cliente y el servidor.
typedef [user_marshal(userm_type)] wire-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
-
userm-type
-
Especifica el identificador del tipo de datos de usuario que se va a serializar. El tipo userm no debe transmitirse y no debe ser un tipo conocido para el compilador MIDL.
-
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 cable 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.
-
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 local con nombre, userm-type, tiene una correspondencia uno a uno con un tipo de cable que define la representación de cable del tipo. Debe proporcionar rutinas para ajustar el tamaño de los datos para serializar, serializar y desmarizar los datos y liberar memoria. Para obtener más información sobre estas rutinas, vea El atributo user_marshal. Tenga en cuenta que si hay tipos incrustados en los datos que también se definen con user_marshal o [ [wire_marshal], también debe administrar el mantenimiento de esos tipos incrustados.
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, ya que se pueden serializar directamente. Si el tipo de usuario es un puntero completo, debe administrar el alias usted mismo.
Ejemplos
// Marshal a long as a structure containing two shorts.
typedef unsigned long FOUR_BYTE_DATA;
typedef struct _TWO_X_TWO_BYTE_DATA
{
unsigned short low;
unsigned short high;
} TWO_X_TWO_BYTE_DATA;
// ACFL file
typedef [user_marshal(FOUR_BYTE_DATA)] TWO_X_TWO_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