# Component Object Model

Component Object Model (abr. COM) est une technique de composants logiciels développée par Microsoft et DEC, depuis 1994, populaire sur Windows et également disponible sur les systèmes d'exploitation OpenVMS, Tru64 ainsi que d'autres Unix. Utilisée pour mettre en œuvre OLE et ActiveX, COM est dépassé depuis 2009 par le Framework .NET de Microsoft. Les technologies COM regroupent OLE, COM+, Distributed COM et ActiveX.

## Fonctionnalités

Component Object Model est une spécification créée par Microsoft, qui décrit comment un programme exécutable peut être emballé dans un objet par un programmeur, permettant l'utilisation de l'objet par d'autres programmeurs. La spécification COM décrit une interface de programmation ainsi qu'un procédé de communication entre les objets qui est indépendant des langages de programmation.
Un des objectifs de COM est de faciliter la création de programmes par assemblage de composants, où chaque composant peut être mis à jour ou amélioré indépendamment des autres. Ceci est rendu possible par le fait que tous les composants peuvent être assemblés selon la même technique. COM unifie la manière dont les composants mettent à disposition leurs fonctionnalités et la manière dont les autres programmes vont les rechercher et s'en servir. Les programmes qui adhèrent à la spécification COM pourront être réutilisés dans plusieurs langages de programmation, tels que C, Visual Basic, Java, Delphi, FoxPro ou COBOL.

## Caractéristiques

Un objet COM est essentiellement un programme qui met en œuvre une ou plusieurs interfaces de programmation. Chaque interface est une liste de fonctions. Toutes les interfaces sont dérivées de l'interface nommée IUnknown. Les objets COM peuvent être mis en œuvre par des fichiers .exe ou .dll de Microsoft Windows.
L'interface IUnknown comporte trois fonctions: QueryInterface, AddRef et Release. La fonction QueryInterface permet à un programme de demander au composant COM les caractéristiques d'une interface qu'il met en œuvre. Les fonctions AddRef et Release servent à informer le composant qu'un programme est en train de s'en servir. Plusieurs programmes peuvent se servir simultanément d'un composant COM. Un composant COM est exécuté dès qu'un programme s'en sert, et s'arrête automatiquement lorsqu'il n'est plus utilisé par aucun programme.

## Historique

Un des pères de cette technologie fut Anthony Williams, qui la valorisa dans ses livres Object Architecture: Dealing With the Unknown - or - Type Safety in a Dynamically Extensible Class (1988) et On Inheritance: What It Means and How To Use It (1990).

### OLE 1.0

La précédente technologie Microsoft orientée objet fut Object Linking and Embedding (OLE) 1.0, qui a été construit sur les Dynamic Data Exchange (DDE) et spécifiquement conçus pour les documents composés (par exemple lorsqu'un tableau est inséré dans un document Word des changements opérés sur le tableau Excel seront propagés dans le document Word). Cela fut introduit par Word et Excel en 1991 et dans Windows 3.1 un an plus tard. De même en 1991, Microsoft introduisit les contrôles Visual Basic, ou VBX grâce à Visual Basic 1.0.

### OLE 2.0

En 1993, Microsoft sortit les OLE 2, et créa le COM comme modèle objet pour OLE 2. Alors que OLE 1 s'occupait principalement des documents composés, OLE 2 fut destiné à adresser des composants logiciels en général. En 1994, les contrôles OLE (OCX) furent introduits en tant que successeurs des VBX. Dans le même temps, Microsoft décida que OLE 2 s'appellerait simplement OLE, et qu'il ne désignait dès lors plus un acronyme, mais le nom des technologies composants de la firme.
En début d'année 1996, Microsoft renomma certaines parties de OLE concernant Internet, ActiveX, et petit à petit toutes les parties de OLE passèrent sous le signe ActiveX, exception faites des composants faits pour les documents composés et utilisés par exemple par Microsoft Office.

## Produits connexes

COM sert de fondations aux technologies OLE et ActiveX et est disponible dans divers langages de programmation. Les contrôles de Microsoft Foundation Classes (abr. MFC) sont des objets COM et Active Template Library est un ensemble de modèles pour créer des objets COM en langage C++. DCOM et COM+ sont des logiciels de service qui étendent les possibilités d'utilisation des objets COM.
Java RMI, IBM SOM, et CORBA sont des technologies similaires à COM. CORBA offre des fonctionnalités semblables à COM/DCOM. Il existe des logiciels de pont qui permettent d'utiliser un objet COM comme s'il s'agissait d'un objet CORBA ou inversement.
Depuis 2003 la technologie .Net remplace la technologie COM, elle offre bon nombre de ses avantages tout en corrigeant certains problèmes. .Net et Visual Studio offrent diverses possibilités d'utilisation conjointe des technologies COM et .Net. Un objet COM peut être utilisé dans un programme en .Net, par le biais d'un wrapper qui lui donnera l'apparence d'un objet .Net et un objet en .Net peut être utilisé pour mettre en œuvre un composant COM par le biais d'un wrapper qui lui donnera l'apparence d'un composant COM.

### Distributed COM

DCOM est un logiciel middleware de type ORB : un logiciel moteur qui permet à des objets qui s'exécutent sur un ordinateur d'échanger des services avec des objets exécutés par un autre ordinateur. L´ORB fait appel à un ORB exécuté par l'autre ordinateur. Il permet en particulier au programmeur de se servir de l'objet sans tenir compte du fait qu'il est sur un autre ordinateur, DCOM traitant automatiquement les communications entre les deux ordinateurs, y compris l'application du protocole Remote Procedure Call, l'authentification, la sérialisation et l'utilisation de la mémoire cache.

### COM+

COM+ est une suite intégrée de logiciels composée de COM, DCOM et Microsoft Transaction Server. Ce dernier met en œuvre un environnement d'exécution pour les composants COM avec des fonctionnalités de regroupement des threads et des connexions aux bases de données, ainsi que des fonctionnalités d'exécution automatique des composants COM. COM+ comporte un dispositif de contrôle d'accès à base de rôles, une console permet de manipuler un catalogue de composants. Une fois ajoutés au catalogue, ceux-ci peuvent être utilisés depuis un autre ordinateur, et un service se chargera d'arrêter l'exécution d'un composant en cas d'inactivité prolongée. COM+ est incorporé dans Windows 2000.

### OLE

OLE (pour Object Linking and Embedding) vise à permettre d'incorporer un document dans un autre document. Cette fonctionnalité utilise initialement la technique de communication entre programmes Dynamic Data Exchange (abr. DDE).
La version 2.0 de OLE n'utilise plus la technique de communication DDE et la fonctionnalité est assurée par le partage d'un bloc de données entre différentes applications, le bloc en question est un objet COM. Un conteneur OLE est une application qui peut manipuler des blocs de données OLE, et un serveur OLE est une application qui peut produire des blocs OLE.
OLE 2.0 introduit une nouvelle fonctionnalité - Automation - qui permet à un programme de demander à un autre programme d'effectuer des opérations.

### ActiveX

ActiveX est un buzzword qui fait référence à une technologie destinée à transformer des pages web en applications qui, selon l'auteur, sont plus rapides que celles utilisant des applet Java. Dans les faits les objets ActiveX sont des objets COM avec quelques fonctionnalités de plus qui permettent de les utiliser sur le web. Le nom ActiveX a été choisi pour se distancer de la fonction de liaison et incorporation d'objet (anglais Object Linking and Embedding abr. OLE) parce que l'objectif des contrôles ActiveX n'a plus rien à voir. Techniquement il n'y a pas de différence entre un objet COM et un objet ActiveX: l'objet met en œuvre les interfaces IUnknown et IDispatch, la fonction QueryInterface et la fonction DllRegisterServer.

## Représentation dans Common Information Model

Des classes CIM héritées des classes de base du CIM Schema définissent des fonctionnalités de COM. Parmi elles:
* Win32_COMClass représente les propriétés d'un composant COM
* Win32_COMApplication, regroupement logique de classes COM.
* Win32_COMApplicationClasses est une associatiohn abstraite qui lie une instance de Win32_COMClass avec une instance de Win32_COMApplication.
* Win32_COMSetting: Les paramètres associés à un composant ou une application COM.
* Win32_DCOMApplication, propriétés d'une application DCOM