Правила маршалинга для user_marshal и wire_marshal
Спецификация OSF-DCE для маршалинга внедренных типов указателей требует, чтобы при реализации функций>_UserSize типа <, типа <типа>_UserMarshal и <типов>_UserUnMarshal функций. (Приведенные здесь правила и примеры предназначены для маршалинга. Однако процедуры сериализации и демаршалинга должны соответствовать тем же самым ограничениям).
Если тип данных является плоским и не содержит указателей, ваша процедура маршалинга для соответствующего типа userm должна просто маршалировать данные в соответствии с макетом типа данных. Например:
typedef [wire_marshal (long)] void * HANDLE_HANDLE;
Обратите внимание, что тип провода, длинный, это плоский тип. Функция HANDLE_HANDLE_UserMarshal маршалирует длинную всякий раз, когда объект HANDLE_HANDLE передается в него.
Если проводной тип является указателем на другой тип, то ваша подпрограмма маршалинга для соответствующего типа userm должна обрабатывать данные в соответствии со структурой типа, на который указывает проводной тип. Подсистема 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], могут быть свободно внедрены в другие типы.
Связанные разделы