user_marshal 및 wire_marshal 대한 마샬링 규칙

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

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

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    철사 유형( long)은 플랫 형식입니다. HANDLE_HANDLE_UserMarshal 함수는 HANDLE_HANDLE 개체가 전달될 때마다 오랫동안 마샬링합니다.

  • wire-type이 다른 형식에 대한 포인터인 경우 해당 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