user_marshal 특성

user_marshal ACF 특성은 대상 언어(userm-type)의 명명된 로컬 형식을 클라이언트와 서버 간에 전송되는 전송 형식(유선 형식)과 연결합니다.

typedef [user_marshal(userm_type)] wire-type; 
unsigned long __RPC_USER  < userm_type >_UserSize(
    unsigned long __RPC_FAR *pFlags,
    unsigned long StartingSize,
    < userm_type >  __RPC_FAR * pUser_typeObject );
unsigned char __RPC_FAR * __RPC_USER  < userm-type >_UserMarshal(
    unsigned long __RPC_FAR *pFlags,
    unsigned char __RPC_FAR * Buffer,
    < userm_type >  __RPC_FAR * pUser_typeObject);
unsigned char __RPC_FAR * __RPC_USER  < userm_type >_UserUnmarshal(
    unsigned long  __RPC_FAR *  pFlags,
    unsigned char __RPC_FAR *  Buffer,
    < userm_type >  __RPC_FAR * pUser_typeObject);
void __RPC_USER  < userm_type >_UserFree(
    unsigned long  __RPC_FAR * pFlags,
    < userm_type >  __RPC_FAR * pUser_typeObject);

매개 변수

userm-type

마샬링할 사용자 데이터 형식의 식별자를 지정합니다. userm-type은 전송할 수 없으며 MIDL 컴파일러에 알려진 형식일 필요는 없습니다.

wire-type

클라이언트와 서버 간에 실제로 전송되는 명명된 전송 데이터 형식을 지정합니다. 와이어 형식은 MIDL 기본 형식, 미리 정의된 형식 또는 네트워크를 통해 전송될 수 있는 형식의 형식 식별자여야 합니다.

pFlags

플래그 필드( unsignedlong)에 대한 포인터를 지정합니다. 상위 단어는 부동 소수점, big 또는 little-endian 및 문자 표현에 대해 DCE에서 정의한 대로 NDR 데이터 표현 플래그를 지정합니다. 하위 단어는 마샬링 컨텍스트 플래그를 지정합니다. 플래그의 정확한 레이아웃은 type_UserSize 함수에 설명되어 있습니다.

StartingSize

개체 크기를 조정하기 전에 현재 버퍼 크기(오프셋)를 지정합니다.

pUser_typeObject

userm_type 개체에 대한 포인터를 지정합니다.

Buffer

현재 버퍼 포인터를 지정합니다.

설명

명명된 각 로컬 형식인 userm-type에는 형식의 와이어 표현을 정의하는 와이어 형식 과 일대일 대응이 있습니다. 마샬링할 데이터의 크기를 조정하고, 데이터를 마샬링 및 마샬링 해제하고, 메모리를 해제하는 루틴을 제공해야 합니다. 이러한 루틴에 대한 자세한 내용은 user_marshal 특성을 참조하세요. 데이터에 user_marshal 또는 [ wire_marshal]로 정의된 포함된 형식이 있는 경우 포함된 형식의 서비스도 관리해야 합니다.

와이어 형식은 인터페이스 포인터 또는 전체 포인터일 수 없습니다. 와이어 형식에는 잘 정의된 메모리 크기가 있어야 합니다. 지정된 와이어 형식을 마샬링하는 방법에 대한 자세한 내용은 user_marshal 및 wire_marshal 대한 마샬링 규칙을 참조하세요.

userm-type은 직접 마샬링할 수 있으므로 인터페이스 포인터가 아니어야 합니다. 사용자 유형이 전체 포인터인 경우 별칭을 직접 관리해야 합니다.

// Marshal a long as a structure containing two shorts.

typedef unsigned long FOUR_BYTE_DATA;
typedef struct _TWO_X_TWO_BYTE_DATA 
{ 
    unsigned short low; 
    unsigned short high; 
} TWO_X_TWO_BYTE_DATA;
// ACFL file

typedef [user_marshal(FOUR_BYTE_DATA)] TWO_X_TWO_BYTE_DATA;

// Marshaling functions:

// Calculate size that converted data will require in the buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserSize( 
    ULONG __RPC_FAR * pulFlags, 
    ULONG __RPC_FAR ulStartingSize,
    FOUR_BYTE_DATA __RPC_FAR * pul);

// Copy FOUR_BYTE_DATA into buffer as TWO_X_TWO_BYTE_DATA
unsigned long __RPC_USER FOUR_BYTE_DATA_UserMarshal( 
    ULONG __RPC_FAR *pulFlags, 
    char __RPC_FAR * pBufferStart, 
    FOUR_BYTE_DATA __RPC_FAR * pul);

// Recreate FOUR_BYTE_DATA from TWO_X_TWO_BYTE_DATA in buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserUnmarshal( 
    ULONG __RPC_FAR * pulFlags, 
    char __RPC_FAR * pBufferStart, 
    FOUR_BYTE_DATA __RPC_FAR * pul);

// Nothing to do here as the engine frees the top node and FOUR_BYTE_DATA is a flat data type.
void __RPC_USER FOUR_BYTE_DATA_UserFree( 
    ULONG __RPC_FAR * pulFlags, 
    FOUR_BYTE_DATA __RPC_FAR * pul);

참고 항목

ACF(애플리케이션 구성 파일)

MIDL 기본 형식

represent_as

부호 없는

user_marshal 특성

wire_marshal

NdrGetUserMarshalInfo