Uso de servicios de serialización

MIDL genera un código auxiliar de serialización para el procedimiento con los atributos [codificar] y [descodificar]. Cuando se llama a esta rutina, se ejecuta una llamada de serialización en lugar de una llamada remota. Los argumentos de procedimiento se serializan o se desmarcalan de un búfer de la manera habitual. A continuación, tiene un control completo de los búferes.

Por el contrario, cuando el programa realiza la serialización de tipos (un tipo se etiqueta con atributos de serialización), MIDL genera rutinas para ajustar el tamaño, codificar y descodificar objetos de ese tipo. Para serializar los datos, debe llamar a estas rutinas de la manera adecuada. La serialización de tipos es una extensión de Microsoft y, como tal, no está disponible cuando se compila en modo de compatibilidad de DCE (/osf). Mediante el uso de los atributos [encode] y [decode] como atributos de interfaz, RPC aplica codificación a todos los tipos y rutinas definidos en el archivo IDL.

Debe proporcionar búferes alineados adecuadamente al usar servicios de serialización. El principio del búfer debe alinearse en una dirección que sea un múltiplo de 8 o 8 bytes alineados. Para la serialización de procedimientos, cada llamada a procedimiento debe serializarse en una posición de búfer alineada de 8 bytes o desmarshalar. Para la serialización de tipos, el ajuste de tamaño, la codificación y la descodificación deben comenzar en una posición alineada de 8 bytes.

Una manera de que la aplicación se asegure de que sus búferes están alineados es escribir la función midl_user_allocate de forma que cree búferes alineados. En el ejemplo de código siguiente se muestra cómo se puede hacer esto.

#include <windows.h>

#define ALIGN_TO8(p)   (char *)((unsigned long)((char *)p + 7) & ~7)

void __RPC_FAR *__RPC_USER  MIDL_user_allocate(size_t sizeInBytes)
{
    unsigned char *pcAllocated;
    unsigned char *pcUserPtr;

    pcAllocated = (unsigned char *) malloc( sizeInBytes + 15 );
    pcUserPtr =  ALIGN_TO8( pcAllocated );
    if ( pcUserPtr == pcAllocated )
        pcUserPtr = pcAllocated + 8;

    *(pcUserPtr - 1) = pcUserPtr - pcAllocated;

    return( pcUserPtr );
}

En el ejemplo siguiente se muestra la función midl_user_free correspondiente.

void __RPC_USER  MIDL_user_free(void __RPC_FAR *f)
{
    unsigned char * pcAllocated;
    unsigned char * pcUserPtr;

    pcUserPtr = (unsigned char *) f;
    pcAllocated = pcUserPtr - *(pcUserPtr - 1);

    free( pcAllocated );
}