wire_marshal (attributo)

L'attributo [wire_marshal] specifica un tipo di dati che verrà usato per la trasmissione (tipo di cavo) anziché un tipo di dati specifico dell'applicazione (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);

Parametri

wire-type

Specifica il tipo di dati di trasferimento denominato che viene effettivamente trasferito tra client e server. Il tipo wire 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.

type-specifier

Tipo per il quale userm-type diventerà un alias.

userm-type

Specifica l'identificatore del tipo di dati utente da sottoporre a marshalling. Può essere qualsiasi tipo, come specificato dall'identificatore di tipo, purché abbia una dimensione ben definita. Il tipo userm non deve essere trasmesso, ma deve essere un tipo noto al compilatore MIDL.

pFlags

Specifica un puntatore a un campo del flag ( unsignedlong). La parola di ordine elevato specifica i flag di rappresentazione dei dati NDR definiti da DCE per la rappresentazione a virgola mobile, big o little-endian e la rappresentazione di caratteri. La parola di ordine basso specifica un flag di contesto di marshalling. Il layout esatto dei flag è descritto in 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 di dati specifico dell'applicazione, userm-type, ha una corrispondenza uno-a-uno con un tipo di filo che definisce la rappresentazione in transito del tipo. È necessario fornire routine per ridimensionare i dati per il marshalling, effettuare il marshalling e annullare il marshalling dei dati e liberare memoria. Si noti che se sono presenti tipi incorporati nei dati definiti anche con [wire_marshal] o [user_marshal], è necessario gestire anche la manutenzione di tali tipi incorporati. Per altre informazioni su queste routine, vedere Attributo wire_marshal.

L'implementazione deve seguire le regole di marshalling in base alla specifica OSF-DCE. Per informazioni dettagliate sulla sintassi di trasferimento NDR, vedere https://www.opengroup.org/onlinepubs/9629399/chap14.htm. Non è consigliabile usare [wire_marshal] se non si ha familiarità con il protocollo di collegamento.

Il tipo di filo non può essere un puntatore di interfaccia o un puntatore completo. Il tipo wire deve avere una dimensione di memoria ben definita. Per informazioni dettagliate su come effettuare il marshalling di un determinato tipo di rete, vedere Regole di marshalling per user_marshal e wire_marshal.

Il tipo userm non deve essere un puntatore all'interfaccia perché è possibile effettuarne il marshalling direttamente. Se il tipo di utente è un puntatore completo, è necessario gestire manualmente l'aliasing.

Non è possibile usare l'attributo [wire_marshal] con l'attributo [allocate] direttamente o indirettamente, perché il motore NDR non controlla l'allocazione della memoria per il tipo trasmesso.

Esempi

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 
    );

Vedere anche

Allocare

Rappresentazione dei dati

Tipi di base MIDL

Lungo

NdrGetUserMarshalInfo

Attributo wire_marshal

transmit_as

Unsigned

user_marshal