Поделиться через


Атрибут user_marshal

Атрибут [ user_marshal] — это атрибут типа ACF, аналогичный синтаксису [ represent_as]. Как и атрибут IDL, [ wire_marshal], он предлагает более эффективный способ маршализировать данные по сети. В качестве атрибута ACF [user_marshal] позволяет маршалировать пользовательские типы данных, неизвестные MIDL. У каждого конкретного приложения есть соответствующий передаваемый тип, определяющий представление провода.

Тип приложения может быть простым, составным или указателем. Основное ограничение заключается в том, что экземпляр типа должен иметь фиксированный, хорошо определенный размер памяти. Если размер экземпляра типа необходимо изменить, используйте поле указателя, а не соответствующий массив. Кроме того, можно определить указатель на изменяемый тип.

Как и в случае с атрибутом [wire_marshal], вы предоставляете подпрограммы для изменения размера, маршалинга, отмены маршалинга и освобождения проходов. В следующей таблице описаны четыре имена подпрограмм, предоставленных пользователем. Тип <> — это тип пользовательского, указанный в определении типа [user_marshal].

Рутина Описание
<типа>_UserSize Размер буфера данных RPC перед маршалингом на стороне клиента или сервера.
>_UserMarshal типа< Маршалирует данные на стороне клиента или сервера.
<типа>_UserUnmarshal Отменяет анализ данных на стороне клиента или сервера.
>_UserFree типа< Освобождает данные на стороне сервера.

 

Эти пользовательские подпрограммы предоставляются клиентом или серверным приложением на основе атрибутов направления.

Если параметр равен [только в], клиент передается серверу. Клиенту требуются функции>_UserSize типа<типа>_UserMarshal. Серверу требуется>_UserUnmarshal типа<>_UserFree функций.

Для параметра [out]-only сервер передает клиенту. Серверу требуются функции <типа>_UserSize и <типа>_UserMarshal, в то время как клиенту требуется функция <типа>_UserMarshal.

атрибут wire_marshal

Правила маршалинга для маршала пользователей и wire_marshal

user_marshal

wire_marshal

NdrGetUserMarshalInfo