Строки формата RPC NDR
Обработчик NDR: 32-разрядный интерпретатор
В этом документе описываются дескрипторы строк формата, иногда называемые MOP, для 32-разрядной подсистемы NDR. В этом разделе описываются изменения, связанные с переходом от интерпретатора –Oi к уровню интерпретатора –Oif , а также дополнения, связанные с каналами и асинхронной поддержкой.
В этом документе описывается текущая технология языка определения интерфейса Майкрософт (MIDL) с точки зрения подсистемы и текущая подсистема NDR.
Общие сведения
Подсистема NDR — это подсистема маршалинга компонентов удаленного вызова процедур (RPC) и DCOM. Он обрабатывает все проблемы, связанные с заглушками при удаленном вызове. Как процесс, маршалирование NDR управляется кодом C из заглушки, созданных MIDL, генератором JIT-типа MIDL или заглушками, созданными другими средствами или написанными вручную. В свою очередь, подсистема недоставки управляет базовым временем выполнения (DCOM или RPC), которое взаимодействует с определенными транспортами.
Первоначальная цель проекта заключалась в том, чтобы предоставить инструмент для эффективного маршалинга произвольных данных на основе информации, предоставленной компилятором MIDL. Строки формата, описанные в этом документе, и вся информация, созданная компилятором для использования подсистемы NDR, всегда считались внутренним интерфейсом между компилятором и подсистемой. Аналогичным образом, интерфейсы, доступные подсистеме для обработки проблем во время выполнения, также в основном являются внутренними (некоторые исключения существуют на стороне среды выполнения RPC, а некоторые интерфейсы DCOM, используемые подсистемой, являются внешними).
Два типичных подхода к маршалингу всегда были встроенными и управляемыми данными (интерпретируемыми) технологиями. MIDL поддерживает как коммутаторы -Os , так и -Oi* в созданных C заглушках. Кроме того, MIDL может создавать библиотеки TLB, используемые пакетом oleautomation. Соответственно, одна из перспектив внутренних элементов двигателя заключается в том, что он состоит из двух частей.
Первый — это набор подпрограмм, которые обрабатывают изменение размера, маршалинг и т. д., соответствующие типичным объектам типа данных, таким как структура или массив. Эти подпрограммы точно настроены на производительность; Например, обычно они пытаются блокировать копирование данных везде, где это возможно. Эту часть часто называют ядром NDR.
Вторая часть состоит из интерпретатора и связанных с ним частей. Интерпретатор использует подпрограммы из основного обработчика NDR, как будто из внутренней библиотеки, для выполнения удаленного вызова со всеми аргументами, маршалированные и незапланированные, соответствующим образом.
Ядро NDR используется аналогичным образом, независимо от того, используется ли он из встроенных заглушок или из интерпретатора. Все подпрограммы ядра зависят от состояния, передаваемого структурой сообщений заглушки. Структура настраивается соответствующим образом с помощью встроенной заглушки или интерпретатора. На протяжении многих лет основной механизм использовался в другом контексте; В настоящее время интерпретатор представляет собой набор из нескольких различных циклов интерпретатора. Они связаны со старыми и новыми интерпретаторами (–Oi и –Oif), а также с циклами, связанными с сериализацией данных (сбором данных), поддержкой асинхронных операций RPC и асинхронной поддержкой DCOM (RPC и DCOM имеют разные модели асинхронного программирования).
Помимо добавления новых функций, важным аспектом эволюции механизма NDR является общий сдвиг в подходе к интерпретаторам. NDR версии 1.1 начинается как часть нового подхода MIDL 2.0 к маршалинга, при этом встроенные заглушки предпочтительнее для повышения производительности. В последней версии отчета о недоставке -Oif стал наиболее широко используемым режимом компилятора, почти за исключением встроенных заглушок.
Дескрипторы строкового формата обработчика NDR RPC более подробно описаны в следующих разделах:
- Строки форматирования
- Строки формата процедуры
- Дескриптор заголовка процедуры
- Маркеры
- Заголовок
- Дескрипторы параметров
- Строки форматирования типов