다음을 통해 공유


user_marshal 및 wire_marshal에 대한 마샬링 규칙

포함된 포인터 형식 마샬링에 대한 OSF-DCE 사양에서는 <형식>_UserSize, <형식>_UserMarshal 및 <형식>_UserUnMarshal 함수를 구현할 때 다음과 같은 제한을 준수해야 합니다. (여기에 제공된 규칙 및 예제는 마샬링을 위한 것입니다. 그러나 크기 조정 및 비마할링 루틴은 동일한 제한을 따라야 합니다.

  • 와이어 형식이 포인터가 없는 플랫 형식인 경우 해당 사용자 유형에 대한 마샬링 루틴은 와이어 형식의 레이아웃에 따라 데이터를 마샬링하기만 하면 됩니다. 예를 들어:

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    먼저, 에 긴인 와이어는 플랫 유형임을 주의하십시오. HANDLE_HANDLE_UserMarshal 함수는 HANDLE_HANDLE 개체가 전달될 때마다 의 길이를 가지는을(를) 마샬링합니다.

  • 와이어 형식이 다른 형식에 대한 포인터인 경우 해당 userm-type에 대한 마샬링 루틴은 와이어 형식이 가리키는 형식의 레이아웃에 따라 데이터를 마샬링해야 합니다. NDR 엔진은 포인터를 처리합니다. 예를 들어:

    typedef struct HDATA
    {
        long size;
        [size_is(size)] long * pData;
    } HDATA;
    
    typedef HDATA * WIRE_TYPE;
    typedef [wire_marshal(WIRE_TYPE)] void * HANDLE_DATA;
    

    WIRE_TYPE와이어 형식은 포인터 형식입니다. HANDLE_DATA_UserMarshal 함수는 HDATA * 레이아웃 대신 HDATA 레이아웃을 사용하여 핸들과 관련된 데이터를 마샬링합니다.

  • 와이어 형식은 플랫 데이터 형식 또는 포인터 형식이어야 합니다. 전달 가능한 형식이 다른 형식(예: 포인터가 있는 구조체)이어야 하는 경우, 원하는 형식에 대한 포인터를 전송 형식으로 사용하십시오.

이러한 제한의 효과는 [wire_marshal] 또는 [user_marshal] 특성으로 정의된 형식을 다른 형식에 자유롭게 포함할 수 있다는 것입니다.

wire_marshal

user_marshal

type_UserSize 함수

type_UserMarshal 함수

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction