Freigeben über


Der einfache Client-Side-Handler

Mit einfachen clientseitigen Handlern können Sie allgemeine clientseitige Handler beliebiger Größe erstellen, damit Sie jede Art von Standardtask ausführen können. Als Handler können diese von mehreren Clients verwendet werden. Sie unterscheiden sich von OLE-Handlern darin, dass sie nicht vor dem Starten des Servers erstellt werden können und ihre Lebensdauer an die des Proxy-Managers gebunden ist, was eine mögliche Racebedingung verhindert, bei der der Handler andernfalls vorzeitig freigegeben werden könnte.

Der Proxy-Manager ist das vom System erstellte Objekt, das die IMarshal-Schnittstelle implementiert. Wenn Sie das Standardmarsaling verwenden, erstellt das System es für Sie, wenn Sie CoGetStandardMarshal (oder CoGetStdMarshalEx, zum Erstellen eines aggregierten Marshallers für einfache Handler) aufrufen und auch die IClientSecurity - und IMultiQI-Schnittstellen für das Objekt implementiert. Auf der Serverseite gibt es ein entsprechendes Systemobjekt, das auch IMarshal implementiert. Diese Objekte verarbeiten das Marshalling für Sie transparent.

Es gibt zwei allgemeine Typen dieser Handler, die Sie möglicherweise implementieren möchten:

  • Ein Handler, der einen Dienst ausführt, der keine zusätzlichen Daten vom Server erfordert
  • Ein Handler, der zusätzliche Daten vom Server verwendet

Einige mögliche Verwendungsmöglichkeiten der zusätzlichen Daten im vom Server bereitgestellten Stream sind wie folgt:

  • Statische Daten vom Server. Unabhängig von der bestimmten Schnittstelle, die gemarshallt wird, schreibt der Server dieselben Daten in den Stream.
  • Daten pro Schnittstelle vom Server. Je nachdem, welche bestimmte Schnittstelle gemarshallt wird, kann der Server unterschiedliche Daten in den Stream schreiben.
  • Schnittstellenbasierte Hilfsprogramme. Schnittstellenspezifische COM-Komponenten werden in den Clienthandler aggregiert und an den Standardproxy delegiert. Um beispielsweise die Netzwerkleistung zu verbessern, könnte eine COM-Komponente für IStream das clientseitige Zwischenspeichern von Daten, Read-Ahead, Write Behind, Op-Locking usw. durchführen.
  • Netzwerkversion einer Schnittstelle. Die Netzwerkversion der Schnittstelle unterscheidet sich von der Schnittstelle, die vom Client- und Serveranwendungscode verfügbar gemacht wird. Es ist z. B. möglich, die verfügbar gemachten Schnittstellen IA und IB über die gleiche Netzwerkschnittstelle INetAB zu multiplex verfügbar zu machen, wie es der Einbettungsserverhandler tut. Beispielsweise könnte man eine Datenübertragungsschnittstelle in eine Netzwerkschnittstelle konvertieren, die Pipes für eine effiziente Datenübertragung verwendet.

Down-Level-Clients verfügen möglicherweise nicht über die Möglichkeit, Schnittstellen mit benutzerdefinierten Handlern zu trennen, aus zwei Gründen: Erstens verstehen sie möglicherweise nicht die CLSID, die im benutzerdefinierten gemarshallten Paket verwendet wird, wenn der Serverhandler aggregiert ist und das Objekt einen Handler wünscht. Zweitens wird der Handlercode möglicherweise nicht einmal auf clientseitiger Seite ausgeführt, wenn er neue Funktionen von COM erfordert, um den aggregierten Standardmarsaler zu erstellen und QueryInterface-Remoteaufrufe auszuführen.

Der OLE-Handler