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.
Argomenti correlati