Правила маршалинга для 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-type должен быть неструктурированным типом данных или типом указателя. Если тип передачи должен быть чем-то другим (например, структурой с указателями), используйте указатель на нужный тип в качестве типа wire-type.

Результатом этих ограничений является то, что типы, определенные атрибутами [wire_marshal] или [user_marshal], можно свободно внедрять в другие типы.

wire_marshal

user_marshal

Функция type_UserSize

Функция type_UserMarshal

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction