Usando serviços de serialização

MIDL gera um stub de serialização para o procedimento com os atributos [codificação] e [decodificação]. Ao chamar essa rotina, você executa uma chamada de serialização em vez de uma chamada remota. Os argumentos de procedimento são realizados em marshaling para ou nãomarsados de um buffer da maneira usual. Em seguida, você tem controle total dos buffers.

Por outro lado, quando o programa executa a serialização de tipo (um tipo é rotulado com atributos de serialização), MIDL gera rotinas para dimensionar, codificar e decodificar objetos desse tipo. Para serializar dados, você deve chamar essas rotinas da maneira apropriada. A serialização de tipo é uma extensão da Microsoft e, como tal, não está disponível quando você compila no modo de compatibilidade de DCE (/osf). Usando os atributos [encode] e [decode] como atributos de interface, o RPC aplica a codificação a todos os tipos e rotinas definidos no arquivo IDL.

Você deve fornecer buffers alinhados adequadamente ao usar serviços de serialização. O início do buffer deve ser alinhado em um endereço que seja um múltiplo de 8 ou 8 bytes alinhado. Para serialização de procedimento, cada chamada de procedimento deve realizar marshal into ou unmarshal de uma posição de buffer alinhada a 8 bytes. Para serialização de tipo, dimensionamento, codificação e decodificação devem começar em uma posição alinhada a 8 bytes.

Uma maneira de seu aplicativo garantir que seus buffers estejam alinhados é gravar a função midl_user_allocate de modo que ele crie buffers alinhados. O exemplo de código a seguir demonstra como isso pode ser feito.

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

O exemplo a seguir mostra a função midl_user_free correspondente.

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