Récepteur d'objet connectible COM
Qu'est-ce qu'un objet connectible ?

Un objet connectible est un objet COM capable d'avertir son client qu'un événement s'est produit dans sa sphère. Les types les plus célèbres d'objet connectible sont les ActiveX.
L'objet défini une interface appelée sortante ou source, qui est implémentée par le client. Par définition, l'objet récepteur, qui réside chez le client, est un objet implémentant l'interface sortante.
Pour utiliser un ActiveX et l'installer dans sa palette de composants, Delphi effectue entre autres, une déclaration de classe dérivée de la classe TOleControl de l'unité OleCtrls, dans une unité de compilation, en utilisant la bibliothèque de types de l'objet.
L'interface d'évènement de l'ActiveX est implémentée par la classe TEventDispatch dont une instance est créée à l'exécution par la classe de base TOleControl et qui a donc le rôle de récepteur de l'objet connectible. C'est la procédure virtuelle pure InitControlData de TOleControl, devant donc être implémentée par les classes descendantes, qui fournit en particulier l'identificateur de l'interface d'événements dans le champ EventIID de la structure TControlData.
On peut aussi noter qu'une interface sortante d'ActiveX semble toujours être une dispinterface, c'est-à-dire une interface IDispatch.

Prenons l'exemple de l'ActiveX VtChart fourni avec Delphi 5 ; nous trouvons bien dans le fichier source Delphi5\Ocx\Vci\Impress\Vcfi\vcfi.pas la déclaration de la classe TVtChart héritant de TOleControl et surchargeant la procédure InitControlData.


Ecriture d'un récepteur générique

Dans certaines circonstances il peut être intéressant de créer un ActiveX à l'exécution, en ayant uniquement son progID (c'est ce qui permet de faire le lien avec l'identificateur de classe, -le CLSID- de l'objet), tout en prenant en charge ses événements.
C'est le cas des contrôles ActiveX de type OPOS (OLE for Point Of Sell) offrant un accès aux périphériques d'encaissement. Par exemple, l'OPOS imprimante offre toujours les mêmes propriétés, méthodes et événements, mais ces contrôles sont fournis par différents constructeurs de caisse, ce qui entraîne des identificateurs GUID différents pour les classes et les interfaces. Il est donc nécessaire de les connaître au moment de la compilation.
L'idée ici est de définir un contrôle OLE générique pour un ensemble d'ActiveX supportant les mêmes interfaces.
Pour cela, nous partirons du source de l'unité OleCtrls.pas pour le modifier et que nous appellerons finalement OleCtrls2.pas. Vous pouvez télécharger ce fichier ainsi que le programme d'exemple créant l'ActiveX VtChart dynamiquement à partir de son progID qui est 'VCFI.VCFiCtrl.1'.
Dans ce programme nous créons également une classe TVtChart2 dérivant de TOleControl, redéfinissant la procédure InitControlData (mais sans fournir d'identificateur pour l'interface d'évènements), et ne prenant en charge, pour simplifier, que deux événements de l'ActiveX.
Le CLSID est obtenu grâce à la fonction ProgIDToClassID de l'unité ComObj, tandis que nous avons modifier la méthode InterfaceConnect de OleCtrls pour obtenir le point de connection de l'ActiveX.
Ici nous employons l'interface IEnumConnectionPoints pour obtenir le premier point de connection. Ensuite c'est l'appel de la méthode Advise de l'interface IConnectionPoint que supporte l'ActiveX qui fait le lien avec le récepteur implémentant l'interface sortante IDispatch.
Une autre méthode a été modifiée : la méthode QueryInterface de la classe TEventDispatch pour renvoyer un pointeur d'interface IDispatch sans vérification, si l'on demande autre chose qu'un pointeur d'interface de type IUnknown.

Une dernière chose : l'implémentation de la classe de sommet TObject étant compatible avec la norme binaire COM (vTable), il est logique de trouver d'abord les données membres correspondants aux gestionnaires d'évènement comme c'est le cas dans la déclaration de la classe TVtChart2.


Ressources

OleCtrls2.pas et le projet de test pour Delphi 5
Un utilitaire à posséder absolument : OLE/COM Object Viewer
http://www.microsoft.com/com/resources/oleview.asp

"Au coeur de Distributed COM", Microsoft Press.

Sommaire

Qu'est-ce qu'un objet connectible ?
Ecriture d'un récepteur générique
Ressources

Début

Copyright © 2003 OBJECT-EVERYWHERE. Tous droits réservés | Bertrand Goetzmann