2.10.1 Intégration avec différents langages
Un développeur d’objet COM en C++ (par exemple) va définir ses interfaces personnalisées en langage IDL puis utiliser le compilateur MIDL (Microsoft IDL) pour traduire son fichier IDL en fichier d’en-tête compréhensible par le compilateur C++ et ainsi pouvoir accéder à la définition de ses interfaces.
Bien évidemment aucun autre langage n’est capable de lire ce fichier de définition. La solution à ce problème consiste à utiliser des bibliothèques de types.
Une bibliothèque de types peut être considérée comme une version binaire d’un fichier IDL. Son principal intérêt tient au fait qu’un nombre important d’environnements reconnait les bibliothèques de types (Visual Basic, Visual J++, Visual C++, Delphi, Microsoft Visual
FoxPro, VBA). Les différents environnements récupèrent les informations sur les interfaces d’un objet COM et les traduisent pour en faire un fichier d’en-tête compris par le compilateur. [MAR 98]
On facilite ainsi l’intégration d’un composant COM avec toutes sortes de langages. De plus, l’utilisation des bibliothèques de types permet de simplifier le code du coté client.
2.10.2 Création d’une bibliothèque de types
Une interface étant définie, le compilateur MIDL fourni avec l’environnement de développement permet de générer la définition de l’interface dans le langage de L‟environnement ou après quelques moindres modifications en bibliothèque de types, fichier au format “.tlb” [MAR 98].
Exemple : définition de l’interface Iperso qui hérite de IUnknown et déclare une seul méthode
FonctionPerso().
import “unknown.idl”; // contient la définition de l’interface
IUnknown
[ object, uuid(10000001-0000-0000-0000-000000000001)]
interface Iperso : IUknown
{
HRESULT FonctionPerso([in] int x, [in] int y , [out, retval] int* retval);
};
[ uuid(10000003-0000-0000-0000-000000000001), // UUID
description
helpstring(“Librairie de type, objet COM”), version(1.0) ]
library CSimpleObjetLib
{
importlib(“stdole32.tlb”);
interface Iperso;
[ uuid(10000002-0000-0000-0000-000000000001) ] // UUID
bibliothèque
coclass CSimpleObjet
{
interface Iperso; }
};
La commande helpstring() permet de décrire la bibliothèque, c’est cette chaîne qui est lue par les utilitaires de recherche des composants qu’incorporent certains outils de développement. La commande library “nomfichier” indique au compilateur MIDL qu’il doit générer une bibliothèque de types, fichier “nomfichier.tlb”.
La commande importlib(“stdole32.tlb”) importe la bibliothèque de types contenant les définitions des interfaces standard IUnknown, IDispatch, et IEnumVARIANT.
La commande coclass “nom de l’objet COM” permet d’énumérer toutes les interfaces de la classe COM.
2.10.3 Enregistrement d’une bibliothèque de types
Pour pouvoir utiliser une bibliothèque de types elle doit être enregistrée dans la base de registre. L’inscription se fait dans la rubrique HKEY_CLASSES_ROOT\TypeLib. L’inscription peut se faire soit à l’aide d’un fichier d’inscription d’extension “.reg” soit à partir de la fonction d’auto-inscription LoadTypeLibEx() ou mieux encore par la fonction RegisterServer() qui permet d’enregistrer à la fois l’objet COM et ses librairies [MAR 98]. Autres fonctions utiles:
UnRegisterTypeLib() ou UnregisterServer() : pour supprimer un enregistrement dans la base de registre.
QueryPathOfRegTypeLib() : qui retourne le chemin de la bibliothèque inscrite dans la base de registre.
Page suivante : 2.11 L'automation ou l’interface IDispatch
Retour au menu : UTILISATION DES SCRIPTS POUR LE DEVELOPPEMENT DES COMPOSANTS COM ADAPTABLES