Правила маршалинга для 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], можно свободно внедрять в другие типы.
Связанные темы