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