Utilisation simplifiée des objets automation

Michaël Moreno

Les DLL (Dynamic Linked Library) contiennent des fonctions essentielles appelées par les logiciels. La simplicité de leur déploiement et leur réutilisabilité au sein de plusieurs projets rendent ces bibliothèques de fonctions et d’objets très intéressantes pour les professionnels. Elles présentent pourtant certaines limites. Les DLL doivent être totalement indépendantes du langage utilisé. En pratique, on s’aperçoit qu’elles sont au contraire très dépendantes de celui-ci, soit en raison d’une mauvaise programmation soit parce qu’elles ont été conçues pour être utilisées avant tout avec un certain langage de programmation. Ainsi, on dénombre sur le NET une myriade de DLL écrites en C++ que l’on ne peut utiliser en pratique qu’avec la dernière version de Visual C++, même les autres compilateurs C++ ne parviennent pas à compiler les fichiers d’en-tête fournis. Alors, autant dire que de se servir de ces DLL sous Visual Basic ou Delphi est un véritable challenge.

Il existe pourtant un substitut simple : les objets Automation (extension de COM – Component Object Model). La technologie derrière ces objets dépasse de loin le cadre de ce bref tutoriel. Toutefois, l’utilisation de ces objets est des plus simples, et ce, sous n’importe quel langage de programmation « moderne » tel que Basic, C++ ou encore Pascal Objet. La programmation de ces objets est en revanche légèrement plus difficile. Sachant que l’objet ainsi programmé sera utilisable en réseau sous Delphi, C++ Builder, Visual C++, Visual Basic, Excel, Word, ACCESS, etc. la difficulté supplémentaire de leur programmation est grandement récompensée.

Le but de ce tutoriel est d’introduire la programmation des objets Automation sans aucune autre prétention que celle de créer quelques fonctions simples appelables depuis Excel ou Delphi. Le logiciel de programmation utilisé est Delphi 6 pro. Les utilisateurs de C++ Builder n’auront aucune difficulté à créer leurs propres objets en lisant ce tutoriel, car le wizard est commun à Delphi et Builder.

- Titre : Utilisation simplifiée des objets automation

- Auteur : Michaël Moreno

- Parution : 2 janvier 2002

- Mise à jour : 5 janvier 2020

- Public visé :

- Licence : Copyright ® 2002 Michaël Moreno. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- Introduction

- I. Programmation de l’objet Automation

- I-A. Création de la bibliothèque ActiveX

- I-B. Création de la bibliothèque de types

- I-C. Création de l’objet automation

- I-D. Ajout de propriétés

- I-E. Ajout de méthode

- I-F. Rafraîchissement

- I-G. Programmation de l’objet

- I-G-1. Rajout de variables private

- I-G-2. Programmation de Get et Set Données

- I-G-3. Programmation de la méthode Moyenne

- I-H. Initialisation et destructeur

- I-I. Enregistrement

- I-J. Recensement de l’objet

- II. Interface avec Excel

- III. Interface avec Delphi

- III-A. Importation de la bibliothèque de types

- III-B. Création des objets

- IV. Conclusion

Introduction

NB : La programmation des objets automation requiert un bon niveau de programmation. Une mauvaise utilisation de ces objets ou une erreur de la part du programmeur peut créer une grande instabilité du système d’exploitation et une perte irrémédiable des données présentes sur le disque dur. Les programmeurs non expérimentés et ne maîtrisant pas Delphi, VBA pour Excel et la base de registre ne devraient pas étudier ce tutoriel.

L’auteur ne saurait être tenu responsable des dégradations de toute sorte se produisant sur n’importe quel ordinateur suite à la lecture et à l’utilisation des techniques présentées dans ce document.

Requis (il me semble) : Excel 97, Delphi 3 ou supérieur, IE 4, win 95.
Idéal : Excel 97 - 2000, Delphi 5 ou 6, win XP, NT ou 2000, IE 5 ou supérieur.

Attention : lors d’un débogage sous win 95, 98 ou Me l’interruption avec Ctrl-F2 fera planter votre machine systématiquement. L’utilisation de Ctrl-F7 sur un tableau de variant ou l’un de ses éléments aussi… Et la liste des problèmes de ce type est très longue.

Aucune aide supplémentaire ne sera fournie par l’auteur. Inutile donc de me contacter pour savoir comment faire telle ou telle chose par exemple créer un serveur automation d’accès à une base de données. Le site https://www.developpez.com/ ou le forum nzn.fr.delphi du newsgroup news.vienneinfo.org devraient vous apporter pratiquement toutes les solutions à vos problèmes.

I - Programmation de l’objet Automation

Les objets automation sont contenus dans des bibliothèques de types, elles-mêmes faisant partie de bibliothèque ActiveX. Il est donc nécessaire avant de créer un tel objet de créer une bibliothèque ActiveX et une bibliothèque de types.

I-A - Création de la bibliothèque ActiveX

Cliquez sur le menu Fichier puis nouveau puis sur Autre.

Sur l’onglet ActiveX, sélectionnez l’icône de la bibliothèque ActiveX et cliquez sur OK.

Il apparaît alors un nouveau projet de type library :

1. library Project1;

2. uses

3. ComServ;

4. exports

5. DllGetClassObject,

6. DllCanUnloadNow,

7. DllRegisterServer,

8. DllUnregisterServer;

9. {$R *.RES}

10. begin

11. end.

Remarquez ici l’exportation des fonctions DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer. Toutes bibliothèques ActiveX doit présenter ces fonctions qui vont permettre le recensement des objets dans la base de registre. Ne vous en préoccupez pas pour l’instant.

I-B - Création de la bibliothèque de types

Il faut à présent créer la bibliothèque de types. Cliquez sur le menu Fichier puis nouveau puis sur Autre. Sur l’onglet ActiveX, sélectionnez l’icône de la bibliothèque de types et cliquez sur OK.

Ceci lance un wizard et la fenêtre suivante apparaît :

Changez le champ nom en PTest et la chaîne d’aide en « Test – Tutoriel ActiveX ».

I-C - Création de l’objet automation

Il faut à présent créer l’objet Automation. Cliquez sur le menu Fichier puis nouveau puis sur Autre. Sur l’onglet ActiveX, sélectionnez l’icône de l’objet Automation et cliquez sur OK.

Une fenêtre de renseignements apparaît. Tapez pour nom de Coclass : « TestAuto ». Laissez les autres valeurs de champs par défaut. Cliquez sur OK.

I-D - Ajout de propriétés

Avant d’ajouter les propriétés, cliquez droit sur la barre des icônes de la fenêtre de la bibliothèque de types et sélectionnez les libellés texte. Cela affichera le texte sous les icônes de la barre des tâches.

Sélectionnez l’interface de l’objet ITestAuto(1). Cliquez sur l’icône « Propriété » pour ajouter une nouvelle property à votre objet. Donnez-lui comme nom Donnees et sélectionnez le type VARIANT. Cette propriété permettra de faire passer un variant array de double.

I-E - Ajout de méthode

À présent, nous allons créer une méthode permettant de calculer la moyenne des données passées dans la property. Dans le cadre de ce tutoriel, il eut été possible de passer les données en paramètres de la méthode. Cliquez sur l’icône « méthode » et renommez la méthode « Moyenne ».

Cette méthode doit renvoyer sous la forme d’un double la valeur moyenne. Dans l’onglet « Paramètres », créez une variable de nom R de type « double * » (tapez-le en toutes lettres, car ce type - aussi incroyable que cela puisse paraître – n’est pas listé). Double-cliquez sur la cellule du modificateur et sélectionnez la case « Valeur renvoyée » ce qui sélectionnera automatiquement la case « sortie ». Le type renvoyé HRESULT ne doit pas être modifié.

I-F - Rafraîchissement

Il est temps de rafraîchir l’implémentation du code. Cliquez sur le bouton « Rafraîchir ». Ceci va créer le code de la structure de l’objet dans les fichiers « .pas ».

Parfois cette méthode rafraîchit mal le code. Sous Delphi 6 le nombre de bogues du wizard a été nettement diminué par rapport à Delphi 5. Si votre code est mal rafraîchi, l’enregistrement des fichiers permet souvent de résoudre les problèmes de rafraîchissement. Les messages d’erreur qui peuvent survenir risquent de vous laisser perplexe. Personnellement, l’apprentissage a été long et difficile.

Une fois rafraîchit le code source apparaît :

I-G - Programmation de l’objet

Toute l’architecture a été créée. Il reste à coder l’objet aussi simplement que n’importe quel objet Pascal à quelques différences près.

I-G-1 - Rajout de variables private

Dans la partie private, ajoutez les variables FDonnees et FNbDonnees comme suit :

Rajoutez l’unité Variants dans la clause des uses.

I-G-2 - Programmation de Get et Set Données

L’objet Automation doit savoir communiquer avec l’extérieur. Les propriétés permettent de simplifier la transmission des paramètres. Dans le cas des objets les property n’existent pas et sont remplacées directement par deux méthodes « set » et « get ». Le code est présenté et commenté ci-dessous :

I-G-3 - Programmation de la méthode Moyenne

Le calcul de la méthode moyenne est des plus simples :

I-H - Initialisation et destructeur

Il est « interdit » de surcharger le constructor de l’objet Automation. L’objet parent TautoObject implémente le constructor Create et la dernière méthode appelée par celui-ci est la procédure Initialize. C’est cette procédure que l’on réintroduit dans notre objet pour initialiser correctement les différentes variables de l’objet. L’implémentation du destructor Destroy est en revanche identique à celle d’un objet Pascal usuel.

L’implémentation du destructor et de l’initialize est immédiate :

I-I - Enregistrement

Suivez la procédure suivante pour enregistrer votre projet et unité pascal.

L’unit1 devient : DefTestAuto et le Project1 devient PTestAuto :

I-J - Recensement de l’objet

Afin que les autres logiciels connaissent l’existence des objets Automation, il est nécessaire de les recenser au sein de la base de registre.

Après avoir fini l’exercice, n’oubliez pas de dérecenser votre serveur ActiveX afin de ne pas polluer inutilement votre base de registre.

En fait il est possible de recenser le serveur à l’aide de la ligne de commande du type suivant :

Regsvr32 « Chemin\NomProjet.dll »

Et de le dérecenser avec la ligne de commande similaire à :

Regsvr32 -u « Chemin\NomProjet.dll »

II - Interface avec Excel

Sous Excel, créez un bouton dans une feuille, mettez dans son événement OnClick un appel à une subroutine CallTest que vous implémentez dans un module(2).

Sous VBA, il faut importer l’objet Automation. Cliquez sur le menu Outils puis référence.

Dans la liste, sélectionnez l’objet Automation :

puis cliquez sur OK.

Si vous avez bien fait les choses lorsque vous déclarez les variables, vous devez voir dans la liste le nouvel objet TestAuto :

Enfin, tapez le code exemple ci-dessous :

C’est terminé. Cliquez sur le bouton et testez.

III - Interface avec Delphi

L’interface avec Delphi est très différente de celle de Visual Basic.

Il est nécessaire d’importer la bibliothèque de types et d’éventuellement wrapper les objets sous la forme de composants. Pour ma part, je ne crée pas de composants afin de ne pas alourdir inutilement mes programmes lorsque les objets ne sont pas visuels.

III-A - Importation de la bibliothèque de types

Fermez toutes vos applications sous Delphi (ce n’est pas vraiment nécessaire, mais c’est plus sûr). Puis cliquez sur Projet et importez une bibliothèque de types :

Sélectionnez l’objet Automation dans la liste

Décochez la case à cocher du bas « Générer le wrapper de composant »(3) et cliquez sur le bouton Installer. Mettez l’unité dans l’un de vos paquets de composants qui va être recompilé pour l’occasion. Fermez tout et créez une nouvelle application. L’unité a pour nom PTest_TLB et se trouve dans le répertoire Imports de Delphi 6.

III-B - Création des objets

Apposez un bouton et créez un événement OnClick. Que vous coderez dans l’exemple comme suit :

N’oubliez pas de rajouter dans vos uses l’unité importée : Ptest_TLB.

ATTENTION : ajoutez à la fin de la procédure la commande :

varClear(v);

afin de libérer la mémoire allouée à l’OleVariant v.

IV - Conclusion

À partir de ce tutoriel, il devrait vous être possible de programmer n’importe quel objet Automation ou COM. L’apprentissage sera assez long, mais les possibilités de vos applications seront nettement étendues. Vous pourrez programmer sous l’architecture n-tiers et vos programmes pourront communiquer entre eux sur un réseau sans trop de difficultés. Au sein des objets automation on peut gérer des TForm assez facilement. Il suffira que vous découvriez la technique pour le faire sans bogue ce qui m’a pris bien deux jours de travail à l’époque.

(1)On ajoute les propriétés et les méthodes à l’interface de l’objet. L’objet hérite de cette interface et de l’objet TAutoObject. Le client de l’objet ne connaît pas la coclasse TestAuto et n’accède à l’objet qu’au travers de son interface. Il est possible d’implémenter plusieurs interfaces pour un même objet et de faire hériter les interfaces entre elles.

(2)L’utilisation des objets automations ne peut se faire que dans les modules sous VBA.

(3)Il est recommandé de générer le Wrapper de composants au moins une fois pour lire le code automatiquement généré par Delphi.