Page 1 of 1

Les bases de COM

Posted: Mon Mar 09, 2026 12:00 pm
by Hydraxx
# Les bases de COM (Component Object Model)

Salut aujourd’hui on va voir :D **un composant fondamental de l’architecture Windows** :
**COM (Component Object Model)**.

COM est partout dans Windows :

* DirectX
* Media Foundation
* Windows Shell
* WMI
* extensions Explorer
* nombreuses API internes

Beaucoup de développeurs utilisent des technologies Windows sans comprendre **le mécanisme de base derrière les composants Windows**.

Dans ce cours on va voir **les bases de COM** à travers les trois premiers chapitres du livre *Inside COM*.

---

# 1) C’est quoi COM

COM signifie **Component Object Model**.

C’est un **modèle de composants binaires** permettant à des logiciels de communiquer entre eux.

L’idée principale est simple :

Une application n’est plus un gros programme monolithique mais un **assemblage de composants**.

Chaque composant peut être :

* remplacé
* réutilisé
* utilisé par plusieurs applications

---

# 2) Le problème des applications monolithiques

Avant les composants, les programmes étaient souvent :

* un seul exécutable
* difficile à modifier
* impossible à réutiliser

Si une petite partie devait être changée :

* il fallait recompiler toute l’application
* redistribuer tout le programme

Les composants permettent de **remplacer seulement une partie du programme**.

---

# 3) Principe d’un composant

Un composant expose **des interfaces**.

Une interface est simplement **une liste de fonctions accessibles**.

Le client voit uniquement l’interface.

Le code interne du composant reste caché.

---

# 4) Interface : le cœur de COM

Dans COM, tout passe par des interfaces.

Une interface :

* expose des fonctions
* ne contient pas de données
* ne contient pas d’implémentation

En C++ une interface est généralement une **classe virtuelle pure**.

Code: Select all

struct IX
{
virtual void Fx() = 0;
};
---

# 5) Accès à un objet COM

Un objet COM n’est jamais utilisé directement.

On passe toujours par une interface.

Principe :

objet → interface → fonctions

Le client n’a jamais accès à l’implémentation interne.

---

# 6) Les interfaces héritent de IUnknown

Toutes les interfaces COM héritent de **IUnknown**.

IUnknown est l’interface de base de COM.

Elle contient trois fonctions fondamentales.

---

# 7) Les 3 fonctions fondamentales

IUnknown définit trois méthodes :

* QueryInterface
* AddRef
* Release

Ces fonctions contrôlent entièrement les objets COM.

---

# 8) QueryInterface

QueryInterface permet de demander une interface à un objet.

Exemple :

Code: Select all

obj->QueryInterface(IID_IX, (void**)&px);
L’objet retourne un pointeur vers l’interface demandée si elle existe.

Sinon il retourne l’erreur :

E_NOINTERFACE

---

# 9) AddRef

AddRef augmente le compteur de références.

Code: Select all

AddRef();
Chaque fois qu’un client obtient une interface :

le compteur augmente.

---

# 10) Release

Release diminue le compteur de références.

Code: Select all

Release();
Quand le compteur atteint zéro :

l’objet est détruit.

C’est le mécanisme de gestion mémoire de COM.

---

# 11) Navigation entre interfaces

Un objet COM peut exposer plusieurs interfaces.

Exemple :

objet

* IX
* IY

Le client peut naviguer entre elles avec QueryInterface.

---

# 12) Règles de QueryInterface

QueryInterface doit respecter certaines règles :

1. Reflexive

Une interface doit toujours pouvoir se retourner elle-même.

2. Symmetric

Si IX peut obtenir IY alors IY doit pouvoir obtenir IX.

3. Transitive

Si IX peut obtenir IY et IY peut obtenir IZ alors IX doit pouvoir obtenir IZ.

---

# À retenir

COM est un modèle de composants.

Les objets COM sont accessibles uniquement via des interfaces.

Toutes les interfaces héritent de IUnknown.

IUnknown définit trois fonctions fondamentales :

* QueryInterface
* AddRef
* Release

Comprendre ces trois fonctions permet déjà de comprendre **le fonctionnement de base de COM**.

Dans la suite on pourra voir :

* les class factories
* CoCreateInstance
* les serveurs COM
* le threading COM