Funzione type_UserMarshal
Il tipo <funzione>_UserMarshal è una funzione helper per gli attributi [ wire_marshal] e [ user_marshal] . Gli stub chiamano questa funzione per effettuare il marshalling dei dati sul lato client o server. La funzione è definita come:
unsigned char __RPC_FAR * __RPC_USER <type>_UserMarshal(
unsigned long __RPC_FAR * pFlags,
unsigned char __RPC_FAR * pBuffer,
<type> __RPC_FAR * pMyObj);
Il tipo <> nel nome della funzione indica il tipo utente specificato nella definizione del tipo [wire_marshal] o [user_marshal]. Questo tipo può essere non trasmettibile o persino, se usato con l'attributo [user_marshal], un tipo sconosciuto al compilatore MIDL. Il nome del tipo di filo (il nome del tipo trasmissibile) non viene usato nel prototipo di funzione. Si noti, tuttavia, che il tipo di filo definisce il layout di collegamento per i dati come specificato da OSF DCE.
Il parametro pFlags è un puntatore a un campo di flag long senza segno. La parola superiore del flag contiene flag di rappresentazione dei dati NDR definiti da OSF DCE per rappresentazioni a virgola mobile, ordine di byte e caratteri. La parola inferiore contiene un flag di contesto di marshalling come definito dal canale COM. Il layout esatto dei flag all'interno del campo è descritto in La funzione type_UserSize.
Il parametro pBuffer è il puntatore del buffer corrente. Questo puntatore può essere allineato o meno alla voce. Il tipo <funzione>_UserMarshal deve allineare il puntatore del buffer in modo appropriato, effettuare il marshalling dei dati e restituire la nuova posizione del buffer, ovvero l'indirizzo del primo byte dopo l'oggetto sottoposto a marshalling. Tenere presente che la specifica del tipo di filo determina il layout effettivo dei dati nel buffer.
Il parametro pMyObj è un puntatore a un oggetto tipo utente.
Il valore restituito è la nuova posizione del buffer, ovvero l'indirizzo del primo byte dopo l'oggetto nonshaled.
L'overflow del buffer può verificarsi quando si calcolano erroneamente le dimensioni dei dati e si tenta di effettuare il marshalling di più dati del previsto. È consigliabile prestare attenzione per evitare questa situazione. È possibile verificarlo usando il puntatore restituito <tipo>_UserMarshal. In caso contrario, si rischia che il motore NDR generi un'eccezione di overflow del buffer in un secondo momento.
Le eccezioni devono essere rilevate e gestite localmente, le eccezioni non devono essere autorizzate a propiziare lo stack di chiamate.
Argomenti correlati