Сериализация типов
Компилятор MIDL создает до трех функций для каждого типа, к которому применяется атрибут [кодировать] или [декодировать] . Например, для определяемого пользователем типа с именем MyTypeкомпилятор создает код для функций MyType_Encode, MyType_Decode и MyType_AlignSize. Для этих функций компилятор записывает прототипы в Stub.h и исходный код в Stub_c.c. Как правило, можно закодировать объект MyType с помощью MyType_Encode и декодировать объект из буфера с помощью MyType_Decode. MyType_AlignSize используется, если необходимо знать размер буфера маршалинга перед его выделением.
Следующая функция кодирования создается компилятором MIDL. Эта функция сериализует данные для объекта, на который указывает pObject, и буфер получается в соответствии с методом, указанным в дескрипторе. После записи сериализованных данных в буфер вы управляете буфером. Обратите внимание, что дескриптор наследует состояние от предыдущих вызовов, а буферы должны быть выровнены по 8.
Для неявного дескриптора:
void MyType_Encode (MyType __RPC_FAR * pObject);
Для явного дескриптора:
void MyType_Encode (handle_t Handle, MyType __RPC_FAR * pObject);
Следующая функция десериализирует данные из хранилища приложения в объект, на который указывает pObject. Вы предоставляете маршалированные буферы в соответствии с методом, указанным в дескрипторе. Обратите внимание, что дескриптор может наследовать состояние от предыдущих вызовов, а буферы должны быть выровнены по 8.
Для неявного дескриптора:
void MyType_Decode (MyType __RPC_FAR * pObject);
Для явного дескриптора:
void MyType_Decode (handle_t Handle, MyType __RPC_FAR * pObject);
Следующая функция возвращает размер в байтах, который включает экземпляр типа, а также все байты заполнения, необходимые для выравнивания данных. Это позволяет сериализовать набор экземпляров одного или разного типа в буфер, обеспечивая правильность выравнивания данных для каждого объекта. MyType_AlignSize предполагает, что экземпляр, на который указывает pObject, будет маршалирован в буфер, начиная с смещения, выровненного по 8.
Для неявного дескриптора:
size_t MyType_AlignSize (MyType __RPC_FAR * pObject);
Для явного дескриптора:
size_t MyType_AlignSize (handle_t Handle, MyType __RPC_FAR * pObject);
Обратите внимание, что обе удаленные процедуры с неявными дескрипторами привязки и сериализованными типами с неявными дескрипторами сериализации используют одну и ту же глобальную переменную дескриптора. Поэтому рекомендуется не смешивать сериализацию типов и удаленные процедуры в интерфейсе с неявными дескрипторами. Дополнительные сведения см. в разделе неявных и явных дескрипторов.