Le modèle COM

 



Un nouveau monde. C'est une extension intelligente des DLL, présente dans le modèle de programmation OLE2. 
Les composants possèdent des interfaces. Elles définissent un contrat fonctionnel. Le client et le serveur se mettent d'accord sur les noms de fonctions et le type des paramètres.

Les interfaces. 
Elles sont inchangeables et supportent le polymorphisme. 
Elles sont équivalentes à des classes C++ sans implémentation (virtuelles pure).

IUnknown. 
Une interface hérite de IUnknown. Elle doit donc implémenter les fonctions QueryInterface, AddRef et Release.

Un composant est de type in-proc pour une DLL ou out-proc pour un EXE.

Les codes d'erreurs sont de type HRESULT. Un code d'erreur renferme  plusieurs  informations : sévérité, facilité, code retour. 

Chaque élément d'un composant est identifié par un identifiant 128 bits uniques (GUID) : interface IID, composant CLSID. Ces informations sont renfermées dans la base de registre sous le nom logique du composant, le ProgID. 

Avant toute utilisation, un composant doit être enregistré en implémentant les fonctions DllRegisterSrevr et DllUnregisterServer.

L'initialisation de la librairie COM se fait par CoInitializeEx.

Un composant est invoqué par CoCreateInstance, en précisant un GUID de composant et d'interface. Cette invocation créée la fabrique de classe qui est chargée de créer l'objet désiré. 
L'autre méthode d'invocation se fait par CoGetClassObjet et IClassFactory::CreateInstance.

L'utilisation imbriquée de composants. Les composants peuvent être assemblés par composition ou agrégation.

Simplification de la programmation. 
Les smart pointers sont des classes C++ qui facilitent l'appel des méthodes de l'interface IUnknown dans les cas de création, de duplication de composants.

La description IDL des interfaces. 
Pour faciliter la communication entre un client et un composant distant, une description de l'interface doit être créée en langage IDL puis être compilée. 
La compilation produit le code du proxy, du stub et éventuellement une librairie de type. 
Le stub et le proxy sont les éléments de communication entre un client et un serveur.

Automation. 
Dans le cas de composants pilotables par scripts, une librairie de type doit être distribuée, en plus du composant. De plus, les interfaces doivent hériter de IDispatch. 
Les technologies de script introduisent des types de données spécifiques réunis sous l'appellation VARIANT. 
Chaque méthode doit convertir les types du langage en type automation.  
Exemple: les chaînes de caractères sont des BSTR, les tableaux d'entier sont des VARIANT de type VT_I2.

La gestion des threads. 
COM utilise le concept d'appartement pour isoler les unités d'exécution. Plusieurs configurations complexes existent et il faut être rigoureux dans leur utilisation. 
Ces notions utilisent le marshalling interface ou le passage de pointeur entre appartements. Concrètement, un pointeur peut évoluer dans un thread différent, au bon vouloir du système.

Transaction Server (MTS). 
Dans une architecture 3 tiers, les composants s'exécutent sur le serveur en tirant parti des services de la base de données. 
MTS fourni, par un mécanisme de surrogate, c'est à dire de lancement à la place de COM, du composant et contrôle ainsi son cycle de vie. 
Le composant dispose maintenant d'un contexte pour gérer les transactions, pour partager des données avec d'autres composants et pour gérer la sécurité du composant en fonction de rôles fonctionnels. MTS met en ouvre un pool d'objets de connexion ainsi qu'une fonctionnalité de cache et de time-out sur les composants.

 
© 2001 Christophe Pichaud. All rights reserved.