LA Technologie COM

 

 

Introduction

Grâce à ces fonctionnalités, toute application Oxygène++ peut être client COM et faire appel à des applications externes qui seront serveurs COM. Cette documentation présente tout d'abord les fonctions implémentées dans Oxygène++ mais également une synthèse des grands principes de la technologie COM. Cette documentation présente également des exemples de communication avec les produits standards du marché et les outils bureautiques du pack Microsoft Office .

 

COM est le modèle objet de base de Microsoft, sur lequel s'appuient les objets ActiveX et OLE. Un objet peut à l'aide de COM, rendre disponible ses fonctionnalités à d'autres objets. COM définit la manière dont un objet rend disponible ses fonctionnalités et la manière dont les programmes externes vont y accéder à travers les processus et le réseau. Cette technologie a été créée par Microsoft afin de l'utiliser dans les produits destinés pour Windows. Ceci permet d'employer les mêmes primitives de communication dans tous les logiciels.

 

 

Définitions

Objets COM

 

Les communications se font entre un serveur et un client. C'est ce dernier qui va initier le processus en demandant à COM de lancer une instance du serveur. (Les mécanismes d'appels)

 

Voici les spécificités de chacun des protagonistes.

 

 

Serveur

Le serveur est un composant (ou objet) qui est habituellement représenté comme suit :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Le rectangle correspond à l'objet lui-même. Les  correspondent à des interfaces. Ici, le serveur nommé « monServeur » exporte (ou rend disponible) l'interface IServeur fournissant ainsi les fonctionnalités de cette interface aux clients COM. On peut imaginer cette interface comme l'objet interface d'un composant OXYGENE ++. Comme tout objet COM, MonServeur dérive de l'interface Iunknown.

Un serveur peut exporter plusieurs interfaces. Ajoutons une interface IServeur2 à notre serveur :

 

 

 

 

 

 

 

IUnknown

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Client

 

Le client veut utiliser les fonctionnalités du serveur. Pour cela, il doit connaître à l'avance les interfaces du serveur ainsi que leurs rôles. Afin d'utiliser les méthodes du serveur, il devra se connecter à une interface puis pourra librement appeler les méthodes de celle-ci. Une fois les traitements terminés, il devra communiquer au serveur qu'il n'a plus besoin de ses services. Ce dernier pourra alors être déchargé de la mémoire.

 

 

 

 

 

 

 

 

 

 

 


Toutefois, il se peut qu'un autre client soit encore en relation avec le serveur, auquel cas le serveur restera chargé en mémoire pour répondre à ses demandes.

 

 

OLE / COM Viewer 

Nous avons vu qu'un client doit connaître à l'avance les interfaces et méthodes du serveur avec lequel il veut communiquer.

Dans ce but, un visualiseur de serveur COM (ou OLE) est livré en standard avec Visual C++ de Microsoft. Il est nommé « OLE / COM Object Viewer » en version anglaise et est téléchargeable à l'adresse internet http://microsoft.com/com/resource/oleview.asp.

Cet utilitaire permet de parcourir l'ensemble des interfaces, leurs méthodes et même les types de données que rend disponible le serveur.

Il est conseillé d'utiliser cet outil afin de comprendre plus rapidement la structure d'un serveur COM.

Pour cela, lancer cet utilitaire et cliquer sur « View TypeLib » dans le menu « File ». Choisissez une librairie de types (extension .tlb ou .olb). Il est possible de choisir par exemple le fichier Excel8.olb décrivant le serveur COM Excel se trouvant par défaut dans le répertoire C:\Program Files\Microsoft Office\Office.

 

Interfaces

Une interface COM encapsule un ensemble de méthodes et de données. Les méthodes sont directement accessibles. Par contre, les variables doivent être lues et écrites à l'aide d'accesseurs, c'est à dire de deux méthodes ayant exactement le même nom que la variable. La première permet de lire la valeur de la donnée, tandis que la deuxième permet de la modifier.

 

Ainsi, une interface IServeur contenant une donnée monEntier aurait une définition en C++ :

Int monEntier() ;  // Permet de lire la donnée.

void monEntier(int i) ;   // Permet de modifier la donnée.

 

Ceci est bien visible dans l'OLE / COM Object Viewer <<!--[if supportFields]>.

Précédemment, nous avons évoqué le nom d'interface IUnknown. Cette interface est l'interface de base de toutes les interfaces. C'est à dire que toutes les interfaces dérivent directement ou indirectement de IUnknown. Cela permet de s'assurer que les méthodes contenues dans IUnknown sont toujours présentes, quelle que soit l'interface. Il s'agit de trois méthodes :

AddRef, Release et QueryInterface.

Les deux premières permettent respectivement d'incrémenter et de décrémenter une variable de classe. Cette variable est aussi appelée compteur de référence. Elle sert à connaître le nombre de clients connectés à une interface. Le but de ce mécanisme est de savoir à quel moment un serveur peut être déchargé de la mémoire par COM. Ce procédé nécessite un peu de rigueur dans la programmation, puisque chaque connexion depuis un client doit être suivie d'un appel à AddRef, et chaque déconnexion précédée d'un appel à Release.

La dernière méthode, QueryInterface, permet de demander à une interface de créer une connexion vers une autre interface. Cela assure un client de pouvoir parcourir librement l'ensemble des interfaces du serveur dès lors qu'il possède une connexion sur une interface.

Toute personne implémentant une interface doit aussi implémenter ces trois méthodes.

 

Mais qu'est-ce exactement qu'une méthode COM ?