wire_marshal 특성

[wire_marshal] 특성은 애플리케이션별 데이터 형식(userm-type) 대신 전송(유선 형식)에 사용할 데이터 형식을 지정합니다.

typedef [wire_marshal(wire_type)] type-specifier userm-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);

매개 변수

wire-type

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

type-specifier

userm-type이 별칭이 될 형식입니다.

userm-type

마샬링할 사용자 데이터 형식의 식별자를 지정합니다. 잘 정의된 크기를 갖는 한 형식 지정자가 지정한 모든 형식일 수 있습니다. userm-type은 전송할 수 없지만 MIDL 컴파일러에 알려진 형식이어야 합니다.

pFlags

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

StartingSize

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

pUser_typeObject

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

Buffer

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

설명

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

구현은 OSF-DCE 사양에 따라 마샬링 규칙을 따라야 합니다. NDR 전송 구문에 대한 자세한 내용은 에서 https://www.opengroup.org/onlinepubs/9629399/chap14.htm확인할 수 있습니다. 유선 프로토콜에 익숙하지 않은 경우 [wire_marshal] 을 사용하지 않는 것이 좋습니다.

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

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

NDR 엔진이 전송된 형식에 대한 메모리 할당을 제어하지 않으므로 [할당] 특성과 함께 [wire_marshal] 특성을 직접 또는 간접적으로 사용할 수 없습니다.

typedef unsigned long _FOUR_BYTE_DATA;

typedef struct _TWO_X_TWO_BYTE_DATA 
{
        unsigned short low;
        unsigned short high;
} TWO_X_TWO_BYTE_DATA;

typedef [wire_marshal(TWO_X_TWO_BYTE_DATA)] 
    _FOUR_BYTE_DATA FOUR_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 
    );

참고 항목

할당

데이터 표현

MIDL 기본 형식

NdrGetUserMarshalInfo

wire_marshal 특성

transmit_as

부호 없는

user_marshal