Ereignisse in einem Automatisierungs-Controller verarbeiten

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Quelltext auf der Basis von Typbibliotheksdefinitionen erstellen


Wenn Sie einen Komponenten-Wrapper für ein Objekt generieren, dessen Typbibliothek Sie importieren möchten, können Sie auf Ereignisse antworten, indem Sie einfach die Ereignisse verwenden, die der generierten Komponente hinzugefügt werden. Wenn Sie jedoch keinen Komponenten-Wrapper verwenden (oder wenn der Server COM+-Ereignisse verwendet) müssen Sie den Quelltext für den Ereignisempfänger selbst schreiben.

Automatisierungsereignisse programmgesteuert verarbeiten

Bevor Sie Ereignisse behandeln können, müssen Sie einen Ereignisempfänger definieren. Dabei handelt es sich um eine Klasse, welche das Ereignis-Dispatch-Interface implementiert, das in der Typbibliothek des Servers definiert ist.

Um einen Ereignisempfänger zu programmieren, erstellen Sie ein Objekt, das das Ereignis-Dispatch-Interface implementiert.

TServerEventsSink = class(TObject, _TheServerEvents) ...{ hier die Methoden des _TheServerEvents deklarieren } end;
class MyEventSinkClass: TEventDispatcher<MyEventSinkClass, DIID_TheServerEvents> { ...// hier die Methoden von DIID_TheServerEvents deklarieren }

Sobald Sie über eine Instanz des Ereignisempfängers verfügen, müssen Sie das Serverobjekt über seine Existenz informieren, damit diese vom Server aufgerufen werden kann. Dazu können Sie die globale Prozedur InterfaceConnect aufrufen und dieser folgende Informationen übergeben:

  • Das Interface zum Server, der Ereignisse generiert.
  • Die GUID für das Ereignis-Interface, das der Ereignisempfänger behandelt.
  • Ein IUnknown-Interface für den Ereignisempfänger.
  • Eine Variable, die einen Longint empfängt, der die Verbindung zwischen dem Server und dem Ereignisempfänger repräsentiert.
{MyInterface ist das Server-Interface, das Sie erhalten, wenn Sie eine Verbindung zum Server herstellen } InterfaceConnect(MyInterface, DIID_TheServerEvents, MyEventSinkObject as IUnknown, cookievar);
pInterface = CoServerClassName.CreateRemote("Machine1"); MyEventSinkClass ES; ES.ConnectEvents(pInterface);

Nach Aufruf von InterfaceConnect ist Ihr Ereignisempfänger verbunden und empfängt Aufrufe vom Server, sobald ein Ereignis eintritt.

Bevor Sie den Ereignisempfänger freigeben, müssen Sie die Verbindung beenden. Rufen Sie dazu die globale Prozedur InterfaceDisconnect auf, und übergeben Sie dieser dieselben Parameter, ausgenommen dem Interface zum Ereignisempfänger. (Die letzte Parameter ist dabei eingehend statt ausgehend.)


InterfaceDisconnect(MyInterface, DIID_TheServerEvents, cookievar);
ES.DisconnectEvents(pInterface);

Hinweis:Sie müssen sich sicher sein, dass der Server seine Verbindung mit Ihrem Ereignisempfänger beendet hat, bevor Sie diesen freigeben. Da Sie nicht wissen, wie der Server auf die von InterfaceDisconnect initiierte Trennungsbotschaft reagiert, kann dies zu einer Konkurrenzsituation führen, wenn Sie Ihren Ereignisempfänger unmittelbar nach dem Aufruf freigeben. Sie beugen diesen Problemen am besten vor, indem der Ereignisempfänger seinen eigenen Referenzzähler verwaltet, der so lange nicht verringert wird, bis der Server das Interface des Ereignisempfängers freigibt.

COM+-Ereignisse verarbeiten

Unter COM+ verwenden Server ein spezielles Hilfsobjekt zum Generieren von Ereignissen, anstatt einen Satz aus speziellen Interfaces (IConnectionPointContainer und IConnectionPoint) zu verwenden. Deswegen können Sie keinen Ereignisempfänger verwenden, der von TEventDispatcher abgeleitet ist. TEventDispatcher ist für diese Interfaces ausgelegt und nicht für COM+-Ereignisobjekte.

Anstelle eines Ereignisempfängers definiert Ihre Client-Anwendung ein Subscriber-Objekt. Subscriber-Objekte liefern wie Ereignisempfänger die Implementierung des Ereignis-Interface. Sie unterscheiden sich von Ereignisempfängern insofern, als dass sie ein bestimmtes Ereignisobjekt abonnieren, anstatt eine Verbindung mit dem Verbindungspunkt eines Servers herzustellen.

Verwenden Sie zur Definition eines Subscriber-Objekts den COM-Objekt-Experten, und wählen Sie das Interface des Ereignisobjekts als dasjenige aus, das implementiert werden soll. Der Experte generiert eine Implementierungs-Unit mit Methodenstrukturen, die Sie zur Erstellung Ihrer Ereignisbehandlungen ausfüllen können.

Hinweis: Sie müssen eventuell mit dem Experten das Interface des Ereignisobjekts der Registrierung hinzufügen, falls es nicht in der Liste der Interfaces erscheint, die Sie implementieren können.

Nach dem Erstellen des Subscriber-Objekts müssen Sie die Interfaces des Ereignisobjekts oder die einzelnen Methoden (Ereignisse) auf diesem Interface abonnieren. Es gibt drei Arten von Abonnements, die Sie auswählen können:

  • Vorübergehende Abonnements: Wie traditionelle Ereignisempfänger sind auch vorübergehende Abonnements an die Lebensdauer einer Objektinstanz gebunden. Wird das Subscriber-Objekt freigegeben, endet das Abonnement, und COM+ leitet keine Ereignisse an es weiter.
  • Persistente Abonnements: Diese sind an die Objektklasse anstatt an eine bestimmte Objektinstanz gebunden. Bei Eintreten des Ereignisses findet oder startet COM eine Instanz des Subscriber-Objekts und ruft ihre Ereignisbehandlung auf. In-Process-Objekte (DLLs) verwenden diese Art von Abonnement.
  • Benutzerbasierte Abonnements: Diese Abonnements bieten eine sicherere Version vorübergehender Abonnements. Sowohl das Subscriber-Objekt als auch das Serverobjekt, das Ereignisse auslöst, müssen unter demselben Benutzerkonto auf demselben Rechner ausgeführt werden.

Siehe auch