Condividi tramite


Regole di marshalling per user_marshal e wire_marshal

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

  • Se il tipo di filo è un tipo flat senza puntatori, la routine di marshalling per il tipo utente corrispondente deve semplicemente eseguire il marshalling dei dati in base al layout del tipo di filo. Ad esempio:

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    Si noti che il tipo di filo, long, è un tipo flat. La funzione HANDLE_HANDLE_UserMarshal esegue il marshalling a lungo ogni volta che viene passato un oggetto HANDLE_HANDLE.

  • Se il tipo di filo è un puntatore a un altro tipo, la routine di marshalling per il tipo utente corrispondente deve eseguire il marshalling dei dati in base al layout per il tipo a cui punta il tipo a. Il motore NDR si occupa del puntatore. Ad 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 filo, 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 di filo deve essere un tipo di dati flat o un tipo di puntatore. Se il tipo trasmissibile deve essere diverso (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 liberamente incorporati in altri tipi.

wire_marshal

user_marshal

Funzione type_UserSize

Funzione type_UserMarshal

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction