Qu'est-ce que COM ? - Pourquoi la conception de COM sous Windows est encore magnifique

· Mis à jour le: · · COM, ActiveX, Développement Windows

Qu’est-ce que COM ?

COM (Component Object Model) est un « contrat binaire » qui permet aux composants de communiquer entre eux sous Windows. C’est un mécanisme de communication fondé sur des interfaces agissant comme des contrats stricts, au-delà des différences de langages et de compilateurs, et qui repose fondamentalement sur la philosophie de conception « programmer pour le contrat, et non pour l’implémentation ».

Les trois éléments clés de COM

1. Une conception centrée sur l’interface

Dans COM, « le contrat prime sur l’implémentation ». Vous pouvez utiliser un objet sans rien connaître de son implémentation interne, du moment que vous connaissez ses interfaces publiées.

2. L’identification par GUID (CLSID / IID)

Chaque composant et chaque interface se voit attribuer un identifiant unique au monde (GUID), si bien que les collisions de noms ne peuvent tout simplement pas se produire.

3. IUnknown

L’interface de base dont héritent toutes les interfaces COM. Elle fournit les trois fonctions suivantes.

Méthode Rôle
QueryInterface Demander si l’objet possède une autre interface
AddRef Augmenter le compteur de références
Release Diminuer le compteur de références (l’objet se détruit lui-même lorsqu’il atteint 0)

Les quatre forces de COM

1. La compatibilité binaire

Une fois compilé, un composant peut être réutilisé quel que soit le langage de programmation ou le runtime. Il est ainsi tout à fait courant d’appeler depuis C# ou Python un composant COM écrit en C++.

2. La séparation des interfaces

L’implémentation étant entièrement masquée et seul le contrat étant publié, l’implémentation interne peut être modifiée librement sans affecter les appelants.

3. La coexistence des versions

Pour ajouter des fonctionnalités tout en préservant la compatibilité ascendante, la conception de base consiste à ajouter de nouvelles interfaces. De nouvelles fonctionnalités peuvent ainsi être proposées sans modifier les anciennes interfaces.

4. La réutilisation au-delà des frontières de processus

Avec le COM hors processus (Out-of-proc COM, serveurs EXE), vous pouvez appeler en toute sécurité des fonctionnalités situées dans un autre processus. Notez toutefois que si le processus serveur plante, l’appelant reçoit des échecs tels que RPC_E_DISCONNECTED ou RPC_S_SERVER_UNAVAILABLE, ce qui nécessite malgré tout une logique de récupération pour redémarrer et se reconnecter.

COM est toujours d’actualité

On a souvent tendance à la considérer comme une « vieille technologie », mais COM est un mécanisme qui reste utilisé aujourd’hui au cœur même de Windows.

Où COM est utilisé

  • Extensions de l’Explorateur (menus contextuels, aperçus)
  • Automatisation Office (contrôle externe d’Excel et de Word)
  • Interopérabilité avec .NET (COM Interop)
  • Systèmes existants incluant ActiveX
  • DirectX, l’API Windows Shell et de nombreuses autres API Windows

Même si vous pensez que « cela ne me concerne pas », tant que vous développez pour Windows, COM apparaît quelque part.

Conclusion

Je pense que la beauté de COM réside dans son « indépendance vis-à-vis du langage, du processus et de l’implémentation ». Une conception d’interface neutre vis-à-vis du langage, une identification unique et une gestion des versions grâce aux GUID, un comptage de références via IUnknown, et un mécanisme qui gère la communication inter-processus de façon transparente. Autant d’idées universelles qui s’appliquent directement au développement orienté composants moderne (les contrats des API REST, la séparation des interfaces dans les microservices, etc.).

Articles récents partageant les mêmes étiquettes, pour approfondir des sujets proches.

Ces pages replacent le sujet dans un contexte plus large de services et de décisions.

Cet article est directement lié aux services suivants.

Questions fréquentes

Questions souvent posées lors d’une consultation sur le sujet de cet article.

Qu'est-ce que COM ?
COM (Component Object Model) est un « contrat binaire » qui permet aux composants de communiquer entre eux sous Windows. C'est un mécanisme qui, au-delà des différences de langages et de compilateurs, communique au moyen d'interfaces agissant comme des contrats stricts. Il repose sur la philosophie de conception consistant à « programmer pour le contrat, et non pour l'implémentation ».
Qu'est-ce qu'IUnknown ?
IUnknown est l'interface de base dont héritent toutes les interfaces COM. Elle fournit trois fonctions : QueryInterface, qui demande si l'objet possède une autre interface ; AddRef, qui augmente le compteur de références ; et Release, qui diminue le compteur de références et détruit l'objet lorsque celui-ci atteint zéro. La gestion de la durée de vie des objets COM repose entièrement sur ce comptage de références.
COM est-il encore utilisé aujourd'hui ?
Oui, COM est un mécanisme qui reste utilisé aujourd'hui au cœur même de Windows. On le retrouve dans les extensions de l'Explorateur (menus contextuels, aperçus), l'automatisation Office d'Excel et de Word, l'interopérabilité avec .NET (COM Interop), les systèmes existants incluant ActiveX, ainsi que dans de nombreuses API Windows comme DirectX ou l'API Windows Shell. Tant que vous développez pour Windows, COM apparaît quelque part.
Quels sont les points forts de COM ?
Il y en a principalement quatre. La compatibilité binaire, qui permet de réutiliser un composant une fois compilé, quel que soit le langage ou le runtime ; la séparation des interfaces, qui masque l'implémentation et ne publie que le contrat ; la coexistence des versions, qui préserve la compatibilité ascendante en ajoutant de nouvelles interfaces ; et enfin, l'appel sécurisé de fonctionnalités d'un autre processus grâce au COM hors processus (Out-of-proc COM, serveur EXE).

Profil de l’auteur

Page de présentation de l’auteur de l’article.

Go Komura

Représentant de KomuraSoft LLC

Spécialisé dans le développement de logiciels Windows, le conseil technique et l’analyse de pannes, notamment pour les systèmes existants et les incidents difficiles à reproduire.

Retour au blog