Атрибут wire_marshal

Атрибут [ wire_marshal] — это атрибут типа IDL, аналогичный синтаксису [ transmit_as], но предоставляющий более эффективный способ маршалинга данных по сети.

Атрибут [wire_marshal] используется для указания типа данных, который будет передаваться вместо типа данных конкретного приложения. Каждый тип приложения имеет соответствующий передаваемый тип, определяющий представление провода (представление, используемое в сети). Тип конкретного приложения не обязательно должен быть передаваемым, но он должен быть типом, который распознает MIDL. Чтобы маршалировать тип, неизвестный ДЛЯ MIDL, используйте атрибут ACF [ user_marshal].

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

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

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

 

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

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

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

Атрибут user_marshal

Правила маршалинга для user_marshal и wire_marshal

wire_marshal

user_marshal

NdrGetUserMarshalInfo