Funzione type_UserSize

La <funzione type>_UserSize è una funzione helper per gli attributi [ wire_marshal] e [ user_marshal]. Gli stub chiamano questa funzione per ridimensionare il buffer di dati RPC per l'oggetto dati utente prima che i dati vengano marshallati sul lato client o server. La funzione è definita come:

unsigned long __RPC_USER  <type>_UserSize(
    unsigned long __RPC_FAR * pFlags,
    unsigned long StartingSize,
    <type>  __RPC_FAR *pMyObj);

Il <tipo> nel nome della funzione indica la definizione del tipo userm, come specificato nella definizione di tipo [wire_marshal] o [user_marshal]. Questo tipo può non esseretransmittable o anche, quando usato con l'attributo [user_marshal] sconosciuto al compilatore MIDL. Il nome del tipo di filo (il nome del tipo trasmesso in rete) non viene usato nel prototipo di funzione. Si noti tuttavia che il tipo di filo definisce il layout per i dati come specificato da OSF DCE. Tutti i dati devono essere convertiti in formato NDR (Network Data Representation).

Il parametro pFlags è un puntatore a un campo di flag lungo senza segno . La parola superiore del flag contiene flag di formato 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 viene visualizzato nella tabella seguente.

BITS Flag valore
31-24 Rappresentazione a virgola mobile 0 = IEEE 1 = VAX 2 = Cray 3 = IBM
23-20 Ordine di byte a virgola mobile e intero 0 = Big-endian 1 = Little-endian
19-16 Rappresentazione dei caratteri 0 = ASCII 1 = EBCDIC
15-0 Flag di contesto di marshalling 0 = MSHCTX_LOCAL 1 = MSHCTX_NOSHAREDMEM 2 = MSHCTX_DIFFERENTMACHINE 3 = MSHCTX_INPROC

 

Il flag di contesto di marshalling consente di modificare il comportamento della routine a seconda del contesto per la chiamata RPC. Ad esempio, se si dispone di un handle (lungo) a un blocco di dati, è possibile inviare l'handle per una chiamata in-process, ma si inviano i dati effettivi per una chiamata a un computer diverso. Il flag di contesto di marshalling e i relativi valori sono definiti nei file Wtypes.h e Wtypes.idl nel Platform Software Development Kit (SDK).

Nota

Quando il tipo di filo è definito correttamente, non è necessario usare i flag di formato NDR, poiché il motore NDR esegue le conversioni necessarie.

 

Il parametro StartingSize è l'offset del buffer corrente. La dimensione iniziale indica l'offset del buffer per l'oggetto utente e potrebbe non essere allineato correttamente. La routine deve tenere conto di qualsiasi riempimento necessario.

Il parametro pMyObj è un puntatore a un oggetto tipo utente.

Il valore restituito è la nuova posizione offset o buffer. La funzione deve restituire le dimensioni cumulative, ovvero le dimensioni iniziali più possibili spaziatura interna e le dimensioni dei dati.

La <funzione type>_UserSize può restituire una sovrastima delle dimensioni necessarie. Le dimensioni effettive del buffer inviato sono definite dalle dimensioni dei dati, non dalle dimensioni di allocazione del buffer.

La <funzione type>_UserSize non viene chiamata se le dimensioni del filo possono essere calcolate in fase di compilazione. Si noti che per la maggior parte delle unioni, anche se non sono presenti puntatori, le dimensioni effettive della rappresentazione del filo possono essere determinate solo in fase di esecuzione.

Regole di marshalling per user_marshal e wire_marshal

user_marshal

wire_marshal