attributo user_marshal
L'attributo user_marshal ACF associa un tipo locale denominato nella lingua di destinazione (tipo utente) a un tipo di trasferimento (tipo di filo) trasferito tra client e server.
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);
Parametri
-
userm-type
-
Specifica l'identificatore del tipo di dati utente da eseguire per il marshalling. Il tipo utente non deve essere trasmesso e non deve essere un tipo noto al compilatore MIDL.
-
tipo di filo
-
Specifica il tipo di dati di trasferimento denominato che viene effettivamente trasferito tra client e server. Il tipo di filo deve essere un tipo di base MIDL, un tipo predefinito o un identificatore di tipo di un tipo che può essere trasmesso attraverso la rete.
-
pFlags
-
Specifica un puntatore a un campo flag ( senza segno). La parola ad ordine elevato specifica i flag di rappresentazione dei dati NDR definiti da DCE per la rappresentazione a virgola mobile, big o little-endian e rappresentazione dei caratteri. La parola a basso ordine specifica un flag di contesto di marshalling. Il layout esatto dei flag è descritto nella funzione type_UserSize.
-
StartingSize
-
Specifica le dimensioni correnti del buffer (offset) prima di ridimensionare l'oggetto.
-
pUser_typeObject
-
Specifica un puntatore a un oggetto di userm_type.
-
Buffer
-
Specifica il puntatore del buffer corrente.
Commenti
Ogni tipo locale denominato, userm-type, ha una corrispondenza uno-a-uno con un tipo di filo che definisce la rappresentazione del filo del tipo. È necessario fornire routine per ridimensionare i dati per il marshalling, per eseguire il marshalling e annullare il marshalling dei dati e liberare memoria. Per altre informazioni su queste routine, vedere L'attributo user_marshal. Si noti che se sono presenti tipi incorporati nei dati definiti anche con user_marshal o [ [wire_marshal], è necessario gestire anche la manutenzione di tali tipi incorporati.
Il tipo di filo non può essere un puntatore di interfaccia o un puntatore completo. Il tipo di filo deve avere dimensioni di memoria ben definite. Per informazioni dettagliate su come eseguire il marshalling di un determinato tipo di filo, vedere Regole di marshalling per user_marshal e wire_marshal.
Il tipo userm non deve essere un puntatore di interfaccia perché può essere eseguito direttamente il marshalling. Se il tipo di utente è un puntatore completo, è necessario gestire autonomamente l'aliasing.
Esempi
// 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);
Vedere anche