Condividi tramite


Stringhe di formato RPC NDR

Motore NDR: interprete a 32 bit

Questo documento descrive i descrittori di stringa di formato, talvolta definiti MOP, per il motore NDR a 32 bit. In questa sezione vengono descritte le modifiche associate all'evoluzione dall'interprete –Oi al livello dell'interprete –Oif, nonché aggiunte correlate alle pipe e al supporto asincrono.

Questo documento descrive la tecnologia MIDL (Microsoft Interface Definition Language) corrente dal punto di vista del motore e il motore NDR corrente.

Panoramica

Il motore NDR è il motore di marshalling dei componenti Remote Procedure Call (RPC) e DCOM. Gestisce tutti i problemi correlati allo stub di una chiamata remota. Come processo, il marshalling NDR è basato sul codice C dagli stub generati da MIDL, da un generatore di tipi JIT MIDL o da stub generati da altri strumenti o scritti manualmente. A sua volta, il motore NDR determina il runtime sottostante (DCOM o RPC) che comunica con trasporti specifici.

L'obiettivo originale della progettazione era stato quello di fornire uno strumento per il marshalling efficace per i dati arbitrari, in base alle informazioni fornite dal compilatore MIDL. Le stringhe di formato descritte in questo documento, e in effetti tutte le informazioni generate dal compilatore per l'utilizzo del motore NDR, sono sempre state considerate un'interfaccia interna tra il compilatore e il motore. Analogamente, anche le interfacce disponibili per il motore per gestire i problemi di runtime sono principalmente interne (alcune eccezioni esistono sul lato runtime RPC e alcune interfacce DCOM usate dal motore sono esterne).

Due approcci tipici al marshalling sono sempre stati inline e la tecnologia basata sui dati (interpretata). MIDL supporta entrambi i commutatori -Os e –Oi* nei relativi stub generati da C. Inoltre, MIDL può generare le librerie TLB usate dal pacchetto oleautomation. Di conseguenza, una prospettiva degli interni del motore è che è costituita da due parti.

Il primo è un set di routine che gestiscono il ridimensionamento, il marshalling e così via, corrispondenti a oggetti di tipo di dati tipici come una struttura o una matrice. Queste routine sono ottimizzate per le prestazioni; Ad esempio, in genere tentano di bloccare la copia dei dati laddove possibile. Questa parte viene spesso definita motore NDR principale.

La seconda parte è costituita da un interprete e dai relativi pezzi correlati. L'interprete usa routine del motore NDR di base, come se fosse da una libreria interna, per eseguire una chiamata remota con tutti gli argomenti di cui è stato effettuato il marshalling e l'annullamento del marshalling, in base alle esigenze.

Il motore NDR principale viene usato in modo analogo se usato da stub inline o dall'interprete. Tutte le routine del motore di base dipendono dallo stato passato da una struttura di messaggi stub. La struttura viene configurata in modo appropriato dallo stub inline o dall'interprete. Nel corso degli anni il motore principale era stato usato in un contesto diverso; attualmente l'interprete è un set di diversi cicli di interpreti distinti. Questi sono correlati agli interpreti old e new (–Oi e –Oif), nonché ai cicli correlati alla serializzazione dei dati (pickling), al supporto async RPC e al supporto asincrono DCOM (RPC e DCOM hanno modelli di programmazione asincroni diversi).

Oltre all'aggiunta di nuove funzionalità, un aspetto importante dell'evoluzione del motore NDR è un cambiamento generale nell'approccio agli interpreti. NDR versione 1.1 è iniziato come parte di un nuovo approccio MIDL 2.0 al marshalling, con gli stub inline preferiti per le considerazioni sulle prestazioni. Con la versione più recente di NDR, –Oif è diventata la modalità più usata del compilatore, quasi all'esclusione di stub inline.

I descrittori di stringa di formato rpc NDR Engine sono descritti in modo più dettagliato negli argomenti seguenti: