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.