Serialization Services 사용

MIDL은 [인코딩] 및 [디코딩] 특성을 사용하여 프로시저에 대한 serialization 스텁을 생성합니다. 이 루틴을 호출할 때 원격 호출 대신 serialization 호출을 실행합니다. 프로시저 인수는 일반적인 방식으로 버퍼에서 마샬링되거나 숨을 들이쉬지 않습니다. 그런 다음 버퍼를 완전히 제어할 수 있습니다.

반면 프로그램에서 형식 serialization(형식에 serialization 특성이 레이블이 지정됨)을 수행하는 경우 MIDL은 해당 형식의 개체의 크기, 인코딩 및 디코딩에 대한 루틴을 생성합니다. 데이터를 직렬화하려면 적절한 방법으로 이러한 루틴을 호출해야 합니다. 형식 serialization은 Microsoft 확장이므로 DCE 호환성(/osf) 모드에서 컴파일할 때 사용할 수 없습니다. RPC는 [인코딩] 및 [디코딩] 특성을 인터페이스 특성으로 사용하여 IDL 파일에 정의된 모든 형식 및 루틴에 인코딩을 적용합니다.

serialization 서비스를 사용할 때 적절하게 정렬된 버퍼를 제공해야 합니다. 버퍼의 시작은 8의 배수 또는 8 바이트 정렬된 주소에 맞춰야 합니다. 프로시저 직렬화의 경우 각 프로시저 호출은 8 바이트가 정렬된 버퍼 위치에서 마샬링 또는 마샬링 해제해야 합니다. 형식 직렬화의 경우 크기 조정, 인코딩 및 디코딩은 8 바이트가 정렬된 위치에서 시작해야 합니다.

애플리케이션에서 버퍼가 정렬되도록 하는 한 가지 방법은 midl_user_allocate 함수를 작성하여 정렬된 버퍼를 만드는 것입니다. 다음 코드 샘플에서는 이 작업을 수행하는 방법을 보여 줍니다.

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

다음 예제에서는 해당 midl_user_free 함수를 보여줍니다.

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