Marshallingdetails

Wenn Sie standardmäßiges Marshalling verwenden, verarbeitet COM alle hier beschriebenen Details für Sie. Es gibt jedoch nur wenige Programmierer, die diese Details benötigen und für diejenigen, die an den zugrunde liegenden Informationen interessiert sind. Marshalling ist der Prozess des Packens und Entpackens von Parametern, sodass ein Remoteprozeduraufruf erfolgen kann.

Verschiedene Parametertypen werden auf unterschiedliche Weise gemarshallt. Das Marshallen eines ganzzahligen Parameters umfasst beispielsweise das einfache Kopieren des Werts in den Nachrichtenpuffer. (Selbst in diesem einfachen Fall gibt es Probleme wie die Bytereihenfolge für computerübergreifende Aufrufe.) Das Marshallen eines Arrays ist jedoch ein komplexerer Prozess. Arraymember werden in einer bestimmten Reihenfolge kopiert, sodass die andere Seite das Array genau rekonstruieren kann. Wenn ein Zeiger gemarshallt wird, werden die Daten, auf die der Zeiger zeigt, gemäß den Regeln und Konventionen für den Umgang mit geschachtelten Zeigern in Strukturen kopiert. Es sind eindeutige Funktionen vorhanden, um das Marshalling jedes Parametertyps zu verarbeiten.

Beim standardmäßigen Marshalling sind die Proxys und Stubs systemweite Ressourcen für die Schnittstelle und interagieren über ein Standardprotokoll mit dem Kanal. Standard-Marshalling kann sowohl von COM-standarddefinierenden Schnittstellen als auch von benutzerdefinierten Schnittstellen wie folgt verwendet werden:

  • Bei den meisten COM-Schnittstellen sind die Proxys und Stubs für das Standard-Marshalling Prozesskomponentenobjekte, die aus einer systemweiten DLL geladen werden, die von COM in Ole32.dll bereitgestellt wird.
  • Bei benutzerdefinierten Schnittstellen werden die Proxys und Stubs für das Standard-Marshalling vom Schnittstellen-Designer generiert, in der Regel mit MIDL. Diese Proxys und Stubs werden statisch in der Registrierung konfiguriert, sodass jeder potenzielle Client die benutzerdefinierte Schnittstelle über Prozessgrenzen hinweg verwenden kann. Diese Proxys und Stubs werden aus einer DLL geladen, die sich über die Systemregistrierung befindet, und verwenden die Schnittstellen-ID (IID) für die benutzerdefinierte Schnittstelle, die sie marshallen.
  • Eine Alternative zur Verwendung von MIDL zum Generieren von Proxys und Stubs für benutzerdefinierte Schnittstellen. Stattdessen kann eine Typbibliothek generiert werden, und das vom System bereitgestellte, typbibliotheksgesteuerte Marshallingmodul marshallt die Schnittstelle.

Als Alternative zum Standard-Marshalling kann eine Schnittstelle (Standard oder benutzerdefiniert) benutzerdefiniertes Marshalling verwenden. Beim benutzerdefinierten Marshalling implementiert ein Objekt dynamisch die Proxys zur Laufzeit für jede schnittstelle, die es unterstützt. Für jede angegebene Schnittstelle kann das -Objekt von COM bereitgestelltes Standard-Marshalling oder benutzerdefiniertes Marshalling auswählen. Diese Auswahl wird vom -Objekt auf Schnittstellenbasis getroffen. Sobald die Auswahl für eine bestimmte Schnittstelle getroffen wurde, bleibt sie während der Lebensdauer des Objekts wirksam. Eine Schnittstelle für ein Objekt kann jedoch benutzerdefiniertes Marshalling verwenden, während eine andere schnittstelle das Standardmäßige Marshalling verwendet.

Benutzerdefiniertes Marshalling ist grundsätzlich für das Objekt eindeutig, das es implementiert. Es werden Proxys verwendet, die vom -Objekt implementiert und zur Laufzeit auf Anforderung für das System bereitgestellt werden. Objekte, die benutzerdefiniertes Marshalling implementieren, müssen die IMarshal-Schnittstelle implementieren, während Objekte, die Standard-Marshalling unterstützen, dies nicht tun.

Wenn Sie eine benutzerdefinierte Schnittstelle schreiben möchten, müssen Sie dafür Marshallingunterstützung bereitstellen. In der Regel stellen Sie eine standardmäßige Marshalling-DLL für die von Ihnen entwerfen Schnittstelle bereit. Sie können den Proxy-/Stubcode und die Proxy-/Stub-DLL oder eine Typbibliothek erstellen, mit der COM datengesteuertes Marshalling (mithilfe der Daten in der Typbibliothek) durchführen kann.

Damit ein Client eine Schnittstellenmethode in einem Objekt in einem anderen Prozess aufrufen kann, müssen mehrere Komponenten zusammenarbeiten. Der Standardproxy ist ein Schnittstellenspezifischer Code, der sich im Prozessbereich des Clients befindet und die Schnittstellenparameter für die Übertragung vorbereitet. Sie werden so verpackt oder gemarshallt, dass sie im Empfangsprozess neu erstellt und verstanden werden können. Der Standardstub, auch ein Teil des schnittstellenspezifischen Codes, befindet sich im Prozessbereich des Servers und kehrt die Arbeit des Proxys um. Der Stub entpackt oder entmarshals die gesendeten Parameter und leitet sie an die Objektanwendung weiter. Außerdem werden Antwortinformationen verpackt, die an den Client zurücksenden werden.

Hinweis

Leser, die mit RPC vertrauter als COM sind, können verwendet werden, um die Begriffe Clientstub und Serverstub zu sehen. Diese Begriffe sind analog zu Proxy und Stub.

Komponenten der prozessübergreifenden Kommunikation

Das folgende Diagramm zeigt den Kommunikationsfluss zwischen den beteiligten Komponenten. Auf der Clientseite der Prozessgrenze durchläuft der Methodenaufruf des Clients den Proxy und dann den Kanal, der Teil der COM-Bibliothek ist. Der Kanal sendet den Puffer mit den gemarshallten Parametern an die RPC-Laufzeitbibliothek, die ihn über die Prozessgrenze überträgt. Die RPC-Laufzeit und die COM-Bibliotheken sind auf beiden Seiten des Prozesses vorhanden. Die Unterscheidung zwischen dem Kanal und der RPC-Laufzeit ist ein Merkmal dieser Implementierung und nicht Teil des Programmiermodells oder des konzeptionellen Modells für COM-Client-/Serverobjekte. COM-Server sehen nur den Proxy oder Stub und indirekt den Kanal. Zukünftige Implementierungen können unterschiedliche Ebenen unterhalb des Kanals oder keine Ebenen verwenden.

Diagramm, das die Client.exe und Server.exe Flows auf jeder Seite der Prozessgrenze zeigt.

Kanal

Objektübergreifende Kommunikation

Microsoft RPC

Proxy

Stub