Chaînes de format RPC NDR
Moteur NDR : interpréteur 32 bits
Ce document décrit les descripteurs de chaîne de format, parfois appelés moPs, pour le moteur de remise 32 bits. Cette section décrit les modifications associées à l’évolution de l’interpréteur –Oi à la couche d’interpréteur –Oif, ainsi que les ajouts liés aux canaux et à la prise en charge asynchrone.
Ce document décrit la technologie MIDL (Microsoft Interface Definition Language) actuelle du point de vue du moteur et le moteur de remise actuel.
Aperçu
Le moteur de remise est le moteur de marshaling des composants RPC (Remote Procedure Call) et DCOM. Il gère tous les problèmes liés au stub d’un appel distant. En tant que processus, le marshaling de remise de remise est piloté par le code C à partir de stubs générés par MIDL, d’un générateur de type JIT MIDL ou par des stubs générés par d’autres outils ou écrits manuellement. À son tour, le moteur de remise pilote l’heure d’exécution sous-jacente (DCOM ou RPC) qui communique avec des transports spécifiques.
L’objectif initial de la conception était de fournir un outil de marshaling efficace pour les données arbitraires, en fonction des informations fournies par le compilateur MIDL. Les chaînes de format décrites dans ce document et, en effet, toutes les informations générées par le compilateur pour la consommation du moteur de remise ont toujours été considérées comme une interface interne entre le compilateur et le moteur. De même, les interfaces disponibles pour le moteur pour gérer les problèmes d’exécution sont également principalement internes (certaines exceptions existent côté exécution RPC et certaines interfaces DCOM utilisées par le moteur sont externes).
Deux approches classiques du marshaling ont toujours été inline et la technologie pilotée par les données (interprétée). MIDL prend en charge les commutateurs –Os et –Oi* dans ses stubs générés par C. De plus, MIDL peut générer les bibliothèques TLB utilisées par le package oleautomation. En conséquence, une perspective des internes du moteur est qu’elle se compose de deux parties.
Le premier est un ensemble de routines qui gèrent le dimensionnement, le marshaling, et ainsi de suite, correspondant à des objets de type de données classiques comme une structure ou un tableau. Ces routines sont affinées pour les performances ; par exemple, ils tentent généralement de bloquer la copie des données dans la mesure du possible. Cette partie est souvent appelée moteur de remise principale.
La deuxième partie se compose d’un interprète et de ses pièces connexes. L’interpréteur utilise des routines à partir du moteur de remise de remise de base, comme si à partir d’une bibliothèque interne, afin d’exécuter un appel distant avec tous ses arguments marshalés et non délimités, le cas échéant.
Le moteur de remise de remise de base est utilisé de manière similaire, que ce soit à partir de stubs inline ou de l’interpréteur. Toutes les routines du moteur principal dépendent de l’état transmis par une structure de message stub. La structure est configurée de manière appropriée par le stub inline ou par l’interpréteur. Au fil des années, le moteur principal avait été utilisé dans un contexte différent ; actuellement, l’interpréteur est en fait un ensemble de plusieurs boucles d’interpréteur distinctes. Celles-ci sont liées aux interpréteurs anciens et nouveaux (–Oi et –Oif), ainsi qu’aux boucles liées à la sérialisation des données (pickling), à la prise en charge asynchrone de RPC et à la prise en charge asynchrone de DCOM (RPC et DCOM ont différents modèles de programmation asynchrone).
Au-delà de l’ajout de nouvelles fonctionnalités, un aspect important de l’évolution du moteur de remise de remise est un changement général dans l’approche des interprètes. La version NDR 1.1 a commencé dans le cadre d’une nouvelle approche MIDL 2.0 pour le marshaling, les stubs inline étant préférés pour les considérations relatives aux performances. Avec la version la plus récente de NDR, –Oif est devenu le mode le plus largement utilisé du compilateur, presque à l’exclusion des stubs inline.
Les descripteurs de chaîne de format rpc NDR Engine sont décrits plus en détail dans les rubriques suivantes :
- chaînes de format
- chaînes de format de procédure
- descripteur d’en-tête de procédure
- Handles
- l’en-tête
- descripteurs de paramètres
- chaînes de format de type