Share via


Funzione type_from_xmit

Gli stub chiamano la funzione type_from_xmit per convertire i dati dal tipo trasmesso al tipo presentato all'applicazione. La funzione è definita come:

void __RPC_USER <type>_from_xmit ( 
    <xmit_type> __RPC_FAR *, 
    <type> __RPC_FAR *);

Il primo parametro è un puntatore ai dati trasmessi. La funzione imposta il secondo parametro in modo che punti ai dati presentati.

La funzione type_from_xmit deve gestire la memoria per il tipo presentato. La funzione deve allocare memoria per l'intera struttura di dati che inizia all'indirizzo indicato dal secondo parametro, ad eccezione del parametro stesso (lo stub alloca memoria per il nodo radice e lo passa alla funzione). Il valore del secondo parametro non può cambiare durante la chiamata. La funzione può modificare il contenuto in tale indirizzo.

In questo esempio la funzione DOUBLE_LINK_TYPE_from_xmit converte la matrice ridimensionata in un elenco a doppio collegamento. La funzione mantiene il puntatore valido all'inizio dell'elenco, libera la memoria associata al resto dell'elenco, quindi crea un nuovo elenco che inizia con lo stesso puntatore. La funzione usa una funzione di utilità , InsertNewNode, per aggiungere un nodo elenco alla fine dell'elenco e per assegnare i puntatori pNext e pPrevious ai valori appropriati.

void __RPC_USER DOUBLE_LINK_TYPE_from_xmit(
     DOUBLE_XMIT_TYPE __RPC_FAR * pArray,
     DOUBLE_LINK_TYPE __RPC_FAR * pList)
{
    DOUBLE_LINK_TYPE *pCurrent;
    int i;
 
    if (pArray->sSize <= 0) 
    {  
        // error checking
        return;
    }
 
    if (pList == NULL) // if invalid, create the list head
        pList = InsertNewNode(pArray->asNumber[0], NULL);             
    else 
    {    
        DOUBLE_LINK_TYPE_free_inst(pList);  // free all other nodes
        pList->sNumber = pArray->asNumber[0];
        pList->pNext = NULL; 
    }
 
    pCurrent = pList; 
    for (i = 1; i < pArray->sSize; i++)  
        pCurrent = InsertNewNode(pArray->asNumber[i], pCurrent);
    
    return;
}