Aggregation (COM)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu COM-Server


In einigen Fällen benutzt ein Server-Objekt ein anderes COM-Objekt, um einige von dessen Funktionen auszuführen. So kann z.B. ein Bestandsverwaltungsobjekt ein separates Rechnungsstellungs-Objekt benutzen, um Kundenrechnungen zu bearbeiten. Wenn aber das Bestandsverwaltungsobjekt die Schnittstelle zur Rechnungserstellung für Clienten bereitstellen will, tritt ein Problem auf: Obwohl der Client, der die Bestands-Schnittstelle besitzt, QueryInterface aufrufen kann, um die Rechnungs-Schnittstelle zu erhalten, erhält er keine Antwort, denn das Rechnungs-Objekt weiß, wenn es erzeugt wird, nichts vom Bestandsverwaltungsobjekt und kann somit kann als Reaktion auf den QueryInterface-Aufruf keine Bestands-Schnittstelle zurückgeben.

Zur Vermeidung dieses Problems unterstützen einige COM-Objekte die sog. Aggregation. Wenn das Bestandsverwaltungsobjekt eine Instanz des Rechnungs-Objekts erzeugt, übergibt es eine Kopie seiner eigenen IUnknown-Schnittstelle. Das Rechnungs-Objekt kann mit dieser dann jeden QueryInterface-Aufruf beantworten, der eine Schnittstelle anfordert, z.B. auch die nicht unterstützte Rechnungs-Schnittstelle. In diesem Fall werden die beiden Objekte zusammen als Aggregat bezeichnet. Das Rechnungs-Objekt ist das "innere" oder "enthaltene" Objekt des Aggregats, das Bestands-Objekt das "äußere".

Anmerkung:  Um als äußeres Objekt eines Aggregats zu handeln, muss ein COM-Objekt das innere Objekt mit CoCreateInstance oder CoCreateInstanceEx (aus der Windows-API) erzeugen, wobei sein IUnknown-Zeiger als Parameter übergeben wird, den das innere Objekt für QueryInterface-Aufrufe benutzen kann.

Ein inneres Objekts muss von System.TContainedObject abgeleitet sein. Nachdem das Objekt erzeugt ist, wird die IUnknown-Schnittstelle des äußeren Objekts dem Konstruktor übergeben, so dass sie der QueryInterface-Methode für Aufrufe zur Verfügung steht, die das innere Objekt nicht verarbeiten kann.

Siehe auch