Mécanismes avancés
Les fabriques
Un serveur COM est constitué d'interfaces, de types de données et de fabriques. Les fabriques sont souvent implémentées sous la forme d'une interface nommée IFactory. Le rôle de cette interface est de donner accès au client à la première interface. En effet, nous avons déjà vu que le client est capable d'accéder à toutes les interfaces à partir du moment où il possède déjà un accès sur une interface. Pour cela, il doit utiliser la méthode QueryInterface qui est dans l'interface IUnknown.
Lors de la connexion chez un serveur COM, on n'obtient pas tout de suite un lien avec l'interface souhaitée, mais plutôt un lien avec une fabrique du serveur. Il faut ensuite demander à cette fabrique d'établir la connexion avec l'interface désirée par le client.
La connexion avec la fabrique doit être détruite une fois que l'on a obtenu les interfaces souhaitées.
Ce mécanisme est transparent en L4G.
L'interface Idispatch
Un client ordinaire connaît lors de la compilation, le serveur auquel il veut se connecter. Il sait à l'avance les services dont il a besoin.
L'inclusion de la librairie de types au moment de l'édition de lien permet au client d'appeler directement les méthodes des interfaces du serveur. On utilise ici l'édition de lien statique.
Or, il est possible de ne pas connaître au moment de la compilation, le serveur avec lequel le client va être connecté. Ceci est notamment le cas pour les outils de programmation comme OXYGENE ++.
COM fournit à cet effet l'interface IDispatch qui permet de vérifier les noms des méthodes ainsi que le type de leurs paramètres lors de l'exécution. Cette interface donne même la possibilité d'appeler une méthode. C'est une édition de lien dynamique qu'Oxygène++ utilise lorsqu'on se connecte à un serveur COM à partir d'une application écrite en L4G.
La base de registres
La base de registres est présente dans toutes les versions de Windows. Elle permet de stocker des informations nécessaire au bon fonctionnement du système d'exploitation. On peut la visionner à l'aide de la commande « regedit.exe ».
Elle contient notamment le chemin et les paramètres des logiciels associés à chacune des extensions de fichier. On y trouve aussi les paramètres utilisateur de certains logiciels.
COM utilise la base de registres pour y inscrire le nom, le chemin et les paramètres des serveurs COM.
Plusieurs notions apparaissent. Lorsqu'un client veut se connecter au serveur Microsoft Word par exemple, il utilise la chaîne de caractères « Word.Application » ou « Word.Document ». Ce sont des identifiants de programmes ou ProgID. Ce dernier est traduit en interne en un numéro unique sur 128 bits appelé CLSID (identifiant de classe).
Ces informations se trouvent dans la base de registres.
Les ProgID sont sous la clé HKEY_CLASSES_ROOT.
Exemple d'arborescence d'un ProgID :
La clé HKEY_CLASSES_ROOT\Word.Application contient une sous-clé CLSID qui donne le numéro d'identifiant de classe, et une sous-clé Curver informant sur le ProgID de la version courante (« Word.Application.8 » au moment où j'écris ces quelques lignes). Ainsi, le CLSID de la version 8 de Word peut être trouvé à la clé HKEY_CLASSES_ROOT\Word.Application.8\CLSID.
Mais cela n'informe toujours pas COM sur l'emplacement du programme ni sur son nom de fichier. Pour obtenir ces informations, il faut rechercher le CLSID dans la clé HKEY_CLASSES_ROOT\CLSID\{numéro de CLSID}.
Exemple d'arborescence d'une CLSID :
On y trouve des informations très utiles :
le nom en toutes lettres du serveur (« Application Microsoft Word »)
le ProgID (« Word.Application »)
le chemin et le nom du serveur en mode DLL (sous la clé InprocHandler32)
le chemin et le nom du serveur local (sous la clé LocalServer32)
facultatif : le numéro de la librairie de types (TypeLib).
Ces informations sont suffisantes pour permettre à COM de lancer le serveur lorsqu'un client en fait la demande.
Lorsque le numéro de la librairie de type est indiqué, il est possible de trouver de plus amples informations sur celle-ci dans la clé HKEY_CLASSES_ROOT\TypeLib\{Numéro de librairie de types}.
Exemple d'arborescence d'une librairie de types :
|
|