Die Schnittstelle eines COM-Objekts definieren

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Einfache COM-Server erstellen - Index


Wenn Sie einen Experten zur Erstellung eines COM-Objekts verwenden, generiert dieser automatisch die Typbibliothek, (es sei denn, Sie machen im COM-Objekt-Experten andere Angaben). Über die Typbibliothek erhalten Host-Anwendungen Informationen über die Funktionsweise von Objekten. Darüber hinaus können Sie die Schnittstelle Ihres Objekts über den Typbibliothekseditor festlegen. Die Schnittstellen, die Sie im Typbibliothekseditor definieren, legen fest, welche Eigenschaften, Methoden und Ereignisse Ihre Objekte den Clients zur Verfügung stellt.

Hinweis: Falls Sie im COM-Objekt-Experten eine vorhandene Schnittstelle ausgewählt haben, brauchen Sie keine Eigenschaften und Methoden hinzufügen. Die Definition der Schnittstellen wird aus der Typbibliothek importiert, in der sie definiert wurde. Stattdessen brauchen Sie nur nach den Methoden der importierten Schnittstelle in der Implementierungs-Unit suchen und ihre Grundstrukturen ausfüllen.

Eigenschaften der Schnittstelle des Objekts hinzufügen

Wenn Sie der Schnittstelle Ihres Objekts mit dem Typbibliothekseditor eine Eigenschaft hinzufügen, wird automatisch eine Methode zum Lesen des Eigenschaftswerts und/oder eine Methode zum Setzen des Eigenschaftswerts hinzugefügt. Der Typbibliothekseditor fügt diese Methoden wiederum Ihrer Implementierungsklasse hinzu und erstellt in der Implementierungs-Unit leere Methodenimplementierungen, die Sie ausfüllen müssen.

So fügen Sie eine Eigenschaft der Schnittstelle Ihres Objekts hinzu:

  1. Wählen Sie im Typbibliothekseditor die Standardschnittstelle für das Objekt aus.Dies sollte der Name des Objekts sein, dem ein "I" vorausgeht. Sie ermitteln die Standardschnittstelle, indem Sie im Typbibliothekseditor die CoClass anklicken und die Registerkarte Implementierung auswählen und die Liste der implementierten Schnittstellen nach einem Eintrag durchsuchen, der mit "Standard" markiert ist.
  2. Um eine Eigenschaft mit Lese-/Schreibzugriff offen zu legen, klicken Sie auf der Symbolleiste auf die Schaltfläche Neue Eigenschaft. Klicken Sie andernfalls auf der Symbolleiste auf den Pfeil neben der Schaltfläche Neue Eigenschaft und anschließend auf den offen zu legenden Typ der Eigenschaft.
  3. Geben Sie im Bereich Attribute den Namen und den Typ der Eigenschaft an.
  4. Klicken Sie auf der Symbolleiste des Typbibliothekseditors auf die Schaltfläche Implementierung aktualisieren.Eine Definition sowie Implementierungsstrukturen für die Eigenschaftszugriffsmethoden werden in die Implementierungs-Unit des Objekts eingefügt.
  5. Suchen Sie in der Implementierungs-Unit nach den Zugriffsmethoden für die Eigenschaft. Diese haben Bezeichnungen im Format Get_Eigenschaftsname und Set_Eigenschaftsname. Fügen Sie Quelltext hinzu, der den Eigenschaftswert des Objekts abruft oder setzt. Dieser Quelltext kann einfach nur eine vorhandene Funktion innerhalb der Anwendung aufrufen, auf ein Datenelement zugreifen, das Sie der Objektdefinition hinzufügen, oder andernfalls die Eigenschaft implementieren.

Methoden der Schnittstelle des Objekts hinzufügen

Wenn Sie der Schnittstelle Ihres Objekts mit dem Typbibliothekseditor eine Methode hinzufügen, kann dieser die Methoden wiederum Ihrer Implementierungsklasse hinzufügen und darin leere Implementierungen erstellen, die Sie vervollständigen können.

So stellen Sie eine Methode über die Schnittstelle Ihres Objekts zur Verfügung:

  1. Wählen Sie im Typbibliothekseditor die Standardschnittstelle für das Objekt aus.Dies sollte der Name des Objekts sein, dem ein "I" vorausgeht. Sie ermitteln die Standardschnittstelle, indem Sie im Typbibliothekseditor die CoClass anklicken und die Registerkarte Implementierung auswählen und die Liste der implementierten Schnittstellen nach einem Eintrag durchsuchen, der mit "Standard" markiert ist.
  2. Klicken Sie auf die Schaltfläche Neue Methode.
  3. Geben Sie im Bereich Attribute den Namen der Methode an.
  4. Geben Sie im Bereich Parameter den Rückgabetyp der Methode an, und fügen Sie die entsprechenden Parameter hinzu.
  5. Klicken Sie auf der Symbolleiste des Typbibliothekseditors auf die Schaltfläche Implementierung aktualisieren.Eine Definition sowie Implementierungsstrukturen für die Methode werden in die Implementierungs-Unit des Objekts eingefügt.
  6. Suchen Sie in der Implementierungs-Unit nach der neu eingefügten Methodenimplementierung. Die Methode ist vollständig leer. Geben Sie in der Grundstruktur die Aufgaben an, welche die Methode repräsentieren soll.

Ereignisse Clients zur Verfügung stellen

Ein COM-Objekt kann zwei Arten von Ereignissen generieren. Traditionelle Ereignisse und COM+-Ereignisse.

  • COM+-Ereignisse setzen voraus, dass Sie mit dem Ereignis-Objekt-Experten ein separates Ereignis-Objekt erstellen und Quelltext hinzufügen, der dieses Ereignis-Objekt vom Server-Objekt aus aufruft.
  • Sie können dem Experten einen Großteil der Arbeiten überlassen, die bei der Generierung traditioneller Ereignisse anfallen. Dieser Vorgang wird weiter unten beschrieben.

Hinweis: Der COM-Objekt-Experte generiert nicht den Quelltext für die Ereignisunterstützung. Falls Ihr Objekt traditionelle Ereignisse generieren soll, sollten Sie den Experten für Automatisierungsobjekte verwenden.

Damit ein Objekt Ereignisse generiert, sind folgende Schritte erforderlich:

  1. Aktivieren Sie im Automatisierungsobjekt-Experten das Kontrollkästchen Ereignisunterstützung generieren.Der Experte erzeugt ein Automatisierungsobjekt, das eine Ereignisschnittstelle sowie die Standardschnittstelle enthält. Diese Ereignisschnittstelle hat einen Namen im Format ICoClassnameEvents. Es handelt sich um eine nach außen gerichtete Schnittstelle (Quellschnittstelle), d.h. es handelt sich um keine Schnittstelle, die Ihr Objekt implementiert, sondern vielmehr um eine Schnittstelle, die Clients implementieren müssen und welche von Ihrem Objekt aufgerufen wird. (Dies wird sichtbar, wenn Sie Ihre CoClass auswählen, die Registerkarte Implementierung aufrufen und beachten, dass die Spalte Quelle der Ereignisschnittstelle den Wert True hat.)Neben der Ereignisschnittstelle fügt der Experte der Deklaration Ihrer Implementierungsklasse die Schnittstelle IConnectionPointContainer hinzu sowie mehrere Klassenelemente zur Verarbeitung von Ereignissen. Von diesen neuen Klassenelementen sind die wichtigsten FConnectionPoint und FConnectionPoints, die die Schnittstellen IConnectionPoint und IConnectionPointContainer mithilfe integrierter VCL-Klassen implementieren. FConnectionPoint wird von einer weiteren Methode verwaltet, die der Experte hinzufügt: EventSinkChanged.
  2. Wählen Sie im Typbibliothekseditor die ausgehende Ereignisschnittstelle für das Objekt aus. (Diese hat eine Bezeichnung mit dem Format ICoClassNameEvents.)
  3. Klicken Sie in der Symbolleiste der Typbibliothek auf die Schaltfläche Neue Methode. Jede Methode, die Sie der Ereignisschnittstelle hinzufügen, repräsentiert eine Ereignisbehandlung, die der Client implementieren muss.
  4. Geben Sie im Bereich Attribute den Namen der Ereignisbehandlung an, z.B. MyEvent.
  5. Klicken Sie auf der Symbolleiste des Typbibliothekseditors auf die Schaltfläche Implementierung aktualisieren.Ihre Objektimplementierung verfügt nun über alle Elemente, die zur Annahme von Client-Ereignisempfängern und zur Verwaltung einer Liste der bei Auftreten des Ereignisses aufzurufenden Schnittstellen erforderlich sind. Zum Ausführen der Schnittstellen können Sie eine Methode erstellen, die die einzelnen Ereignisse auf Clients generiert.
  6. Fügen Sie im Quelltext-Editor Ihrem Objekt eine Methode zur Auslösung der einzelnen Ereignisse hinzu. Beispiel:
     unit ev;
     interface
     uses
       ComObj, AxCtrls, ActiveX, Project1_TLB;
     type
        TMyAutoObject = class (TAutoObject,IConnectionPointContainer, IMyAutoObject)
     private
       .
       .
       .
     public
        procedure Initialize; override;
        procedure Fire_MyEvent; { Add a method to fire the event}
  1. Implementieren Sie die im letzten Schritt hinzugefügte Methode, damit diese alle Ereignisempfänger durchläuft, die vom FConnectionPoint-Elemente Ihres Objekts verwaltet werden.
procedure TMyAutoObject.Fire_MyEvent;
var
  I: Integer;
  EventSinkList: TList;
  EventSink: IMyAutoObjectEvents;
begin
  if FConnectionPoint <> nil then
  begin
    EventSinkList :=FConnectionPoint.SinkList; {get the list of client sinks }
    for I := 0 to EventSinkList.Count - 1 do
    begin
      EventSink := IUnknown(FEvents[I]) as IMyAutoObjectEvents;
      EventSink.MyEvent;
    end;
  end;
end;</li>
  1. Immer wenn Sie das Ereignis auslösen müssen, damit Clients über sein Vorkommen informiert werden, rufen Sie die Methode auf, welche die Ereignisse an alle Ereignisempfänger weitergibt.


    if EventOccurs then Fire_MyEvent; { Methode zum Auslösen der Ereignisse aufrufen }

    if (EventOccurs) Fire_MyEvent; // Methode zum Auslösen der Ereignisse aufrufen

Themen

Siehe auch