Définition de l'interface d'un objet COM

De RAD Studio
Aller à : navigation, rechercher

Remonter à Création de serveurs COM simples - Index


Quand vous utilisez un expert pour créer un objet COM, l'expert crée automatiquement une bibliothèque de types (sauf si vous avez demandé le contraire dans l'expert objet COM). La bibliothèque de types permet aux applications hôte de déterminer ce que l'objet peut faire. Elle vous permet également de définir l'interface de l'objet en utilisant l'éditeur de bibliothèques de types. Les interfaces que vous définissez dans l'éditeur de bibliothèques de types définissent les propriétés, méthodes et événements que votre objet expose aux clients.

Remarque :  Si vous sélectionnez une interface existante dans l'expert objet COM, vous n'avez pas besoin d'ajouter des propriétés ou des méthodes. La définition de l'interface est importée depuis la bibliothèque de types dans laquelle l'interface est définie. Il vous suffit alors de trouver les méthodes de l'interface importée dans l'unité d'implémentation et de remplir leur corps.

Ajout d'une propriété à l'interface de l'objet

Quand vous ajoutez une propriété à l'interface de votre objet en utilisant l'éditeur de bibliothèques de types, il ajoute automatiquement une méthode pour lire la valeur de la propriété et/ou une méthode pour définir la valeur de la propriété. L'éditeur de bibliothèques de types, ajoute à son tour ces méthodes à votre classe d'implémentation et crée dans l'unité d'implémentation des squelettes de méthodes que vous devez compléter.

Pour ajouter une propriété à l'interface de votre objet

  1. Dans l'éditeur de bibliothèques de types, sélectionnez l'interface par défaut de l'objet.L'interface par défaut porte le même nom que l'objet mais préfixé par la lettre "I". Pour déterminer l'interface par défaut, dans l'éditeur de bibliothèques de types, cliquez sur la CoClasse puis sélectionnez l'onglet Implémente et recherchez dans la liste des interfaces implémentées celle indiquée comme "Défaut".
  2. Pour exposer une propriété en lecture/écriture, cliquez sur le bouton Nouvelle propriété de la barre d'outils ; vous pouvez aussi cliquer sur la flèche à côté de ce bouton dans la barre d'outils, puis sur le type de propriété à exposer.
  3. Dans le volet Attributs, spécifiez le nom et le type de la propriété.
  4. Dans la barre d'outils de l'éditeur de bibliothèques de types, cliquez sur le bouton Actualiser l'implémentation.Une définition et les squelettes d'implémentation des méthodes d'accès à la propriété sont insérés dans l'unité d'implémentation de l'objet.
  5. Dans l'unité d'implémentation, recherchez les méthodes d'accès de la propriété. Elles ont un nom de la forme Get_NomPropriété et Set_NomPropriété. Ajoutez du code qui récupère ou définit la valeur de la propriété de votre objet. Ce code peut simplement appeler une fonction existante de l'application, accéder à une donnée membre ajoutée à la définition de l'objet ou implémenter autrement la propriété.

Ajout d'une méthode à l'interface de l'objet

Quand vous ajoutez une méthode à l'interface de votre objet en utilisant l'éditeur de bibliothèques de types, l'éditeur de bibliothèques de types ajoute les méthodes à la classe d'implémentation et crée dans l'unité d'implémentation des squelettes de méthode à compléter.

Pour exposer une méthode via l'interface de votre objet

  1. Dans l'éditeur de bibliothèques de types, sélectionnez l'interface par défaut de l'objet.L'interface par défaut porte le même nom que l'objet mais préfixé par la lettre "I". Pour déterminer l'interface par défaut, dans l'éditeur de bibliothèques de types, cliquez sur la CoClasse et sélectionnez l'onglet Implémente et recherchez dans la liste des interfaces implémentées celle indiquée comme "Défaut".
  2. Choisissez le bouton Nouvelle méthode.
  3. Dans la page Attributs, spécifiez le nom de la méthode.
  4. Dans le volet Paramètres, spécifiez le type de valeur renvoyée par la méthode et ajoutez les paramètres appropriés.
  5. Dans la barre d'outils de l'éditeur de bibliothèques de types, cliquez sur le bouton Actualiser l'implémentation.Une définition et le squelette de l'implémentation de la méthode sont insérés dans l'unité d'implémentation de l'objet.
  6. Dans l'unité d'implémentation, trouvez la méthode qui vient d'être insérée. La méthode est entièrement vide. Remplissez le corps de la méthode pour effectuer l'opération que représente la méthode.

Exposition d'événements aux clients

Il y a deux types d'événements qu'un objet COM peut générer : les événements classiques et les événements COM+.

  • Les événements COM+ nécessitent la création d'un objet événement séparé au moyen de l'expert objet événement et l'ajout de code pour appeler cet objet événement depuis votre objet serveur.
  • Vous pouvez utiliser l'expert pour gérer l'essentiel du travail de création des événements classiques. Ce processus est décrit ci-dessous.

Remarque :  L'expert objet COM ne génère pas de code de gestion des événements. Si vous voulez que votre objet génère des événements classiques, utilisez l'expert objet Automation.

Pour que votre objet génère des événements, vous devez effectuer les opérations suivantes :

  1. Dans l'expert Objet Automation, cochez la case Générer le code de support d'événement. L'expert crée un objet qui contient une interface d'événements en plus de l'interface par défaut. Cette interface Events a un nom de la forme ICoClassnameEvents. C'est une interface en sortie (source) : cela signifie que cette interface ne doit pas être implémentée par votre objet mais par les clients, elle est appelée par votre objet. Vous pouvez le constater en sélectionnant la CoClasse, allez sur la page Implémente, vous constaterez que la colonne Source indique true pour l'interface Events. Outre l'interface Events, l'expert ajoute l'interface IConnectionPointContainer à la déclaration de votre classe d'implémentation et plusieurs membres de classe pour gérer les événements. Parmi ces nouveaux membres de classe, les plus importants sont FConnectionPoint et FConnectionPoints, qui implémentent les interfaces IConnectionPoint et IConnectionPointContainer au moyen des classes VCL intégrées. FConnectionPoint est maintenu par une autre méthode ajoutée par l'expert, EventSinkChanged.
  2. Dans l'éditeur de bibliothèques de types, sélectionnez l'interface en sortie Events de votre objet. Elle a un nom de la forme ICoClassNameEvents
  3. Cliquez sur le bouton Nouvelle méthode de la barre d'outils de l'éditeur de la bibliothèques de types. Chaque méthode ajoutée à l'interface Events représente un gestionnaire d'événement que le client doit implémenter.
  4. Dans le volet Attributs, spécifiez le nom du gestionnaire d'événement, par exemple MonEvénement.
  5. Dans la barre d'outils de l'éditeur de bibliothèques de types, cliquez sur le bouton Actualiser l'implémentation.L'implémentation de votre objet contient maintenant tout ce qu'il faut pour accepter les récepteurs d'événements des clients et gérer une liste des interfaces à appeler quand l'événement se produit. Pour appeler ces interfaces, vous pouvez créer une méthode pour générer chaque événement dans les clients.
  6. Dans l'éditeur de code, ajoutez une méthode à votre objet pour déclencher chaque événement. Par exemple,
     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. Codez la méthode ajoutée à l'étape précédente afin qu'elle parcourt tous les récepteurs d'événements gérés dans le membre FConnectionPoint de votre objet :
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. A chaque fois que vous avez besoin de déclencher l'événement pour que les clients soient informés de son occurrence, appelez la méthode qui distribue l'événement à tous les récepteurs d'événements :


    If EventOccurs then Fire_MyEvent; { Call method you created to fire events.}

    if (EventOccurs) Fire_MyEvent; // Call method you created to fire events.

Rubriques

Voir aussi