Salut aujourd’hui on va voir
**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);
Sinon il retourne l’erreur :
E_NOINTERFACE
---
# 9) AddRef
AddRef augmente le compteur de références.
Code: Select all
AddRef();
le compteur augmente.
---
# 10) Release
Release diminue le compteur de références.
Code: Select all
Release();
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
