wire_marshal (attributo)

L'attributo [wire_marshal] specifica un tipo di dati che verrà usato per la trasmissione (tipo di filo) anziché un tipo di dati specifico dell'applicazione (tipo utente).

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

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.

identificatore di tipo

Tipo per il quale il tipo utente diventerà un alias.

userm-type

Specifica l'identificatore del tipo di dati utente da eseguire per il marshalling. Può essere qualsiasi tipo, come indicato 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 flag ( unsignedlong). 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 di dati specifico dell'applicazione, 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. 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 L'attributo wire_marshal.

L'implementazione deve seguire le regole di marshalling in base alla specifica OSF-DCE. I dettagli sulla sintassi del trasferimento NDR sono disponibili in https://www.opengroup.org/onlinepubs/9629399/chap14.htm. Non è consigliabile usare [wire_marshal] se non si ha familiarità con il protocollo di filo.

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 di utente non deve essere un puntatore dell'interfaccia perché può essere eseguito direttamente il marshalling. Se il tipo di utente è un puntatore completo, è necessario gestire autonomamente l'aliasing.

Non è possibile usare l'attributo [wire_marshal] con l'attributo [allocato] 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

long

NdrGetUserMarshalInfo

Attributo wire_marshal

transmit_as

Unsigned

user_marshal