Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn es sich um einen instance Ihres Handlers handelt, der keine zusätzlichen Serverdaten erhält, muss der Server IStdMarshalInfo implementieren, aber nicht IMarshal. IStdMarshalInfo verfügt über eine Methode, GetClassForHandler, die die CLSID des Objekthandlers abruft, der im Zielprozess verwendet werden soll. COM ruft dies auf, wenn es CoMarshalInterface für Sie aufruft und den Handler auf der Clientseite aktiviert.
Als Nächstes müssen sowohl die Server- als auch die Handlerimplementierung die CoGetStdMarshalEx-Funktion aufrufen. Diese Funktion erstellt auf jeder Seite einen Standardmarsaler (auf Clientseite als Proxy-Manager und auf Serverseite als Stub-Manager bezeichnet).
Der Server ruft CoGetStdMarshalEx auf und übergibt das Flag SMEXF_SERVER. Dadurch wird ein serverseitiger Standardmarsaler (Stub-Manager) erstellt. Die serverseitige Struktur ist in der folgenden Abbildung dargestellt:
Server-Side-Struktur
Der Handler ruft CoGetStdMarshalEx auf und übergibt das Flag SMEXF_HANDLER. Dadurch wird ein clientseitiger Standardmarsaler (Proxy-Manager) erstellt und mit dem Handler auf clientseitiger Seite aggregiert. Die Lebensdauer beider Wird vom steuernden Identitätsobjekt (implementierung von IUnknown) verwaltet, das das System implementiert, wenn der Handler CoGetStdMarshalEx aufruft. Die clientseitige Struktur ist in der folgenden Abbildung dargestellt.
Client-Side-Struktur
Wie in der obigen Abbildung gezeigt, ist der Handler tatsächlich zwischen dem Proxy-Manager und der Identität/Steuerung unbekannt aufgeteilt. Dadurch erhält das System die Kontrolle über die Lebensdauer des Objekts, während der Handler die Kontrolle über die verfügbar gemachten Schnittstellen erhält. Die gestrichelte Linie zwischen Identitäts- und Proxy-Manager gibt an, dass die beiden über interne private Schnittstellen eng miteinander integriert sind.
Wenn COM CoUnmarshalInterface für den Client aufruft, erstellt es den Handler instance und aggregiert ihn mit der Identität. Der Handler erstellt den Standardmarsaler (über den Aufruf von CoGetStdMarshalEx und übergibt den steuernden Unbekannten, den er bei der Erstellung erhalten hat). Der Handler implementiert nicht IMarshal , sondern gibt nur IMarshal vom Standardmarsaler zurück. Selbst wenn der Handler IMarshal implementiert, wird er während einer Unmarshal nicht aufgerufen.
Wenn zwei Threads gleichzeitig dasselbe Objekt zum ersten Mal aufheben, ist es möglich, dass zwei Handler vorübergehend erstellt werden. Eine wird anschließend freigegeben.
Zugehörige Themen