ActiveObject
Cet article présente une mise en application de l'enregistrement d'un objet COM, comme objet actif pour sa classe, de sorte que d'autres processus puissent accéder et utiliser cette unique instance à l'exécution.
Ce mécanisme puissant devrait permettre une meilleure collaboration entre applications et servir le modèle de conception "Médiateur".

La bibliothèque OLE offre un moyen d'enregistrer un objet COM comme étant l'objet actif pour sa classe (selon un CLSID donné), au moyen de la fonction RegisterActiveObject. Cet enregistrement fait figurer l'objet dans une table accessible par tout autre processus sur la machine par la fonction Delphi GetActiveOleObject qui appelle à son tour la fonction GetActiveObject de l'API Win32.

Le mécanisme d'enregistrement est implémenté dans la classe TActiveObject comprenant deux constructeurs.
Le premier demande comme premier argument une référence IUnknown et le CLSID de la classe de l'objet : celui-ci est déclaré comme constante dans l'unité correspondant à la bibliothèque de types décrivant l'objet.
Le second constructeur demande une référence IUnknown et le progID de l'objet.
Chacun de ces constructeurs procède à l'enregistrement de l'objet et le désenregistrement a lieu lors de la libération de l'objet TActiveObject.

Cette classe est utilisée dans les programmes de démonstration décris ci-après (voir la rubique Ressources pour télécharger les codes source).
Après avoir dézippé le fichier téléchargé, vous devriez voir apparaître les dossiers OleObject, AppTest et ClientTest.


OleObject

Le projet OleObject.dpr est simplement une bibliothèque ActiveX (DLL) comprenant un objet OLE automation de CoClass TTest, de progId "OleObject.Test", et supportant l'interface ITest. Celle-ci a une propriété nommée Message destinée à écrire ou lire une chaîne de caractères conservée dans la CoClass. Le serveur OLE autmation doit être recensé après compilation.


Apptest

Ce dossier contient le projet AppTest. C'est l'exécutable AppTest.exe qui crée une instance de TTest et l'enregistre en utilisant une instance de TActiveObject au démarrage. La libération de l'objet TActiveObject désenregistre l'instance de TTest lors de la fermeture de l'application. Plus aucune application extérieure ne peut plus alors y avoir accès.


ClientTest

Enfin, le projet ClientTest.dpr démontre l'accès à l'objet TTest recensé, par la fonction GetActiveOleObject en lui passant comme argument le progId "OleObject.Test".
Lancez plusieurs instances de ClientTest.exe. Deux boutons de la fiche principales permettent de lire ou d'écrire dans la propriété Message de l'objet. On peut ainsi observer qu'une chaîne de caractères écrite par l'une des instances est bien relue par l'autre.
S'il n'existe pas d'object recensé pour le progId passé à la fonction GetActiveOleObject, celle-ci lève une exception EOleSysError avec le message "Opération non disponible".


Ressources

Télécharger ActiveObject (Delphi 6)

Sommaire

OleObject
Apptest
ClientTest
Ressources

Début

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