Funzione type_UserMarshal

La <funzione type>_UserMarshal è una funzione helper per gli attributi [ wire_marshal] e [ user_marshal]. Gli stub chiamano questa funzione per eseguire 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 la definizione del tipo userm specificata nella definizione di tipo [wire_marshal] o[user_marshal]. Questo tipo può essere nontransmittable o anche, se usato con l'attributo [user_marshal] , un tipo sconosciuto al compilatore MIDL. Il nome del tipo di filo (nome del tipo trasmissibile) non viene usato nel prototipo di funzione. Si noti tuttavia che il tipo di filo definisce il layout del filo per i dati come specificato da OSF DCE.

Il parametro pFlags è un puntatore a un campo di flag lungo senza segno. La parola superiore del flag contiene flag di rappresentazione dei dati NDR definiti da OSF DCE per rappresentazioni a virgola mobile, ordine byte e rappresentazioni di 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ò o non essere allineato alla voce. La <funzione type>_UserMarshal deve allineare il puntatore del buffer in modo appropriato, eseguire il marshalling dei dati e restituire la nuova posizione del buffer, ovvero l'indirizzo del primo byte dopo l'oggetto 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 nonmarshaled.

Il overflow del buffer può verificarsi quando si calcola in modo errato le dimensioni dei dati e si tenta di eseguire il marshalling di più dati rispetto al previsto. Si dovrebbe prestare attenzione a evitare questa situazione. È possibile controllarlo usando il puntatore che <digita>_UserMarshal restituisce. In caso contrario, il motore NDR genera un'eccezione di overflow del buffer in un secondo momento.

Le eccezioni devono essere rilevate e gestite in locale, le eccezioni non devono essere consentite per propicare lo stack di chiamate.

Regole di marshalling per user_marshal e wire_marshal

wire_marshal

user_marshal