Функция type_UserMarshal
Функция <type>_UserMarshal является вспомогательной для атрибутов [ wire_marshal] и [ user_marshal]. Заглушки вызывают эту функцию для маршалинга данных на стороне клиента или сервера. Функция определяется следующим образом:
unsigned char __RPC_FAR * __RPC_USER <type>_UserMarshal(
unsigned long __RPC_FAR * pFlags,
unsigned char __RPC_FAR * pBuffer,
<type> __RPC_FAR * pMyObj);
Тип <> в имени функции означает тип пользователя, указанный в определении типа [wire_marshal] или [user_marshal]. Этот тип может быть непередаемым или даже ( при использовании с атрибутом [user_marshal] — типом, неизвестным компилятору MIDL. Имя типа провода (имя переводимых типов) не используется в прототипе функции. Обратите внимание, что тип провода определяет структуру провода для данных, как указано в OSF DCE.
Параметр pFlags является указателем на поле длинного флага без знака. В верхнем слове флага содержатся флаги представления данных NDR в соответствии с определением OSF DCE для представлений с плавающей запятой, порядка байтов и символьных представлений. Нижнее слово содержит флаг контекста маршалинга, определенный в канале COM. Точный макет флагов в поле описан в разделе Функция type_UserSize.
Параметр pBuffer — это текущий указатель буфера. Этот указатель может быть выровнен или не выровнен по входу. Функция <type>_UserMarshal должна соответствующим образом выровнять указатель буфера, маршалировать данные и возвращать новую позицию буфера, которая является адресом первого байта после маршалированного объекта. Помните, что спецификация типа провода определяет фактическую структуру данных в буфере.
Параметр pMyObj является указателем на объект типа пользователя.
Возвращаемое значение — это новая позиция буфера, которая является адресом первого байта после несмегалированного объекта.
Переполнение буфера может произойти при неправильном вычислении размера данных и попытке маршалировать больше данных, чем ожидалось. Следует быть осторожным, чтобы избежать этой ситуации. Его можно проверка с помощью указателя, который <возвращает тип>_UserMarshal. В противном случае вы рискуете, что подсистема NDR позже вызовет исключение переполнения буфера.
Исключения должны перехватываться и обрабатываться локально, исключения не должны быть разрешены для распространения в стеке вызовов.
Связанные темы