Condividi tramite


Funzione type_UserSize

La funzione>_UserSize di tipo<è 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 del marshalling dei dati 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 il tipo userm, come 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], sconosciuto al compilatore MIDL. Il nome del tipo di collegamento (il nome del tipo trasmesso attraverso la rete) non viene usato nel prototipo della 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 flag lungo senza segno. La parola superiore del flag contiene flag di formato 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 è illustrato nella tabella seguente.

Bit Bandiera Valore
31-24 Rappresentazione a virgola mobile 0 = IEEE 1 = VAX 2 = Cray 3 = IBM
23-20 Ordine dei byte interi e a virgola mobile 0 = Big-endian 1 = Little-endian
19-16 Rappresentazione di 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 (long) 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 in Platform Software Development Kit (SDK).

Nota

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

 

Il StartingSize un parametro è l'offset del buffer corrente. La dimensione iniziale indica l'offset del buffer per l'oggetto utente e potrebbe essere o meno allineato correttamente. La routine deve tenere conto di qualsiasi spaziatura interna necessaria.

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

Il valore restituito è la nuova posizione offset o buffer. La funzione deve restituire la dimensione cumulativa, ovvero la dimensione iniziale più possibile spaziatura interna più le dimensioni dei dati.

Il tipo <>_UserSize funzione 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.

Il tipo <funzione>_UserSize non viene chiamato 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 in transito possono essere determinate solo in fase di esecuzione.

regole di marshalling per user_marshal e wire_marshal

user_marshal

wire_marshal