Condividi tramite


Regole di instradamento per user_marshal e wire_marshal

La specifica di OSF-DCE per il marshalling dei tipi di puntatore incorporati richiede di osservare le restrizioni seguenti quando si implementano <tipo>_UserSize, <tipo>_UserMarshal e <tipo>_UserUnMarshal. (Le regole e gli esempi indicati di seguito sono per il marshaling. Tuttavia, le routine di dimensionamento e di unmarshaling devono seguire le stesse restrizioni):

  • Se il tipo di cavo è un tipo flat senza puntatori, la routine di marshalling per il tipo userm corrispondente deve semplicemente effettuare il marshalling dei dati in base al layout del tipo di cavo. Per esempio:

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    Nota che il tipo di filo, lungo, è un tipo piatto. La funzione HANDLE_HANDLE_UserMarshal esegue il marshalling di un lungo ogni volta che viene passato un oggetto HANDLE_HANDLE.

  • Se il tipo wire è un puntatore a un altro tipo, la routine di serializzazione per il tipo userm corrispondente deve elaborare i dati secondo il layout del tipo a cui punta il tipo wire. Il motore NDR si occupa del puntatore. Per esempio:

    typedef struct HDATA
    {
        long size;
        [size_is(size)] long * pData;
    } HDATA;
    
    typedef HDATA * WIRE_TYPE;
    typedef [wire_marshal(WIRE_TYPE)] void * HANDLE_DATA;
    

    Si noti che il tipo di cavo, WIRE_TYPE, è un tipo di puntatore. La funzione HANDLE_DATA_UserMarshal esegue il marshalling dei dati correlati all'handle, usando il layout HDATA, anziché il layout HDATA *.

  • Un tipo wire deve essere un tipo di dati semplice o un tipo di puntatore. Se il tipo trasmissibile deve essere qualcos'altro (una struttura con puntatori, ad esempio), usare un puntatore al tipo desiderato come tipo di filo.

L'effetto di queste restrizioni è che i tipi definiti con gli attributi [wire_marshal] o [user_marshal] possono essere incorporati liberamente in altri tipi.

wire_marshal

user_marshal

la funzione type_UserSize

La funzione type_UserMarshal

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction