Partager via


Fonction type_from_xmit

Les stubs appellent la fonction type_from_xmit pour convertir les données de son type transmis en type présenté à l’application. La fonction est définie comme suit :

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

Le premier paramètre est un pointeur vers les données transmises. La fonction définit le deuxième paramètre pour qu’il pointe vers les données présentées.

La fonction type_from_xmit doit gérer la mémoire pour le type présenté. La fonction doit allouer de la mémoire pour l’ensemble de la structure de données qui commence à l’adresse indiquée par le deuxième paramètre, à l’exception du paramètre lui-même (le stub alloue la mémoire pour le nœud racine et la transmet à la fonction). La valeur du deuxième paramètre ne peut pas changer pendant l’appel. La fonction peut modifier le contenu à cette adresse.

Dans cet exemple, la fonction DOUBLE_LINK_TYPE_from_xmit convertit le tableau dimensionné en liste doublement liée. La fonction conserve le pointeur valide vers le début de la liste, libère la mémoire associée au reste de la liste, puis crée une nouvelle liste qui commence au même pointeur. La fonction utilise une fonction utilitaire, InsertNewNode, pour ajouter un nœud de liste à la fin de la liste et pour affecter les pointeurs pNext et pPrevious aux valeurs appropriées.

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;
}