Cours sur COM [HRESULT, GUID, REGISTRY]
Posted: Thu Mar 19, 2026 11:55 am
# COM : HRESULT, GUID, REGISTRY
Salut
aujourd’hui on attaque un chapitre **ULTRA IMPORTANT de COM**.
Ici on ne crée pas encore d’objets (ça sera le chapitre factory)
Ici on comprend **les fondations système** :
* HRESULT (gestion erreurs COM)
* GUID (identité globale)
* Registry (où COM trouve les objets)
* Fonctions de la COM Library
Objectif : comprendre comment COM fonctionne réellement en interne.
---
# 1) HRESULT : le système d’erreur COM
## 1.1 Pourquoi HRESULT existe
En C/C++ classique :
Problème :
* pas d’info
* pas d’origine
* pas scalable
COM utilise :
---
## 1.2 Structure interne (TRÈS IMPORTANT)
Un HRESULT est un entier 32 bits :
* Severity (1 bit) → succès / échec
* Facility (15 bits) → origine (Win32, RPC, COM…)
* Code (16 bits) → code erreur
Exemple mental :
* 8 → erreur
* 7 → Win32
* 5 → Access denied
---
## 1.3 Codes importants
Piège CRITIQUE :
S_FALSE = succès
---
## 1.4 SUCCEEDED / FAILED
NE JAMAIS faire :
car il existe plusieurs succès
Faire :
---
## 1.5 Plusieurs codes possibles
Une fonction peut retourner :
* plusieurs succès
* plusieurs erreurs
donc :
COM ≠ booléen
---
## 1.6 Définir ses propres HRESULT
règle importante :
* utiliser FACILITY_ITF
---
## 1.7 Les erreurs peuvent changer
un composant peut évoluer
nouveaux codes ajoutés
donc client doit :
gérer les erreurs inconnues
---
## 1.8 HRESULT et réseau
COM peut être distant
donc HRESULT permet :
* signaler erreurs réseau
* différencier origine
---
# 2) GUID : identité globale
## 2.1 Définition
GUID = identifiant unique 128 bits
---
## 2.2 Pourquoi GUID
problème : collisions
solution :
unicité globale (machine + temps + random)
---
## 2.3 Génération
ou outil :
* guidgen.exe
---
## 2.4 GUID en mémoire
structure binaire fixe
---
## 2.5 Déclaration GUID
avec INITGUID
---
## 2.6 Comparaison GUID
---
## 2.7 GUID par référence
évite copie
---
## 2.8 GUID et COM
* CLSID → classe
* IID → interface
---
# 3) Registry COM
## 3.1 Pourquoi le registry
COM doit être dynamique
indépendant du code
---
## 3.2 Structure principale
---
## 3.3 InprocServer32
indique :
* DLL
* threading model
---
## 3.4 ProgID
nom lisible
---
## 3.5 VersionIndependentProgID
évite dépendance version
---
## 3.6 Organisation réelle
CLSID → info technique
ProgID → mapping humain
---
# 4) Enregistrement COM
## 4.1 regsvr32
appelle :
---
## 4.2 Implémentation
API utilisées :
---
## 4.3 Self-registration
DLL s’enregistre elle-même
---
# 5) Component Categories
permet :
* classer composants
* filtrer
via CATID
---
# 6) OleView
outil pour explorer COM
* CLSID
* interfaces
* catégories
---
# 7) COM Library
## 7.1 Initialisation
ou
---
## 7.2 Règles
1 fois par thread
CoUninitialize ensuite
---
# 8) Memory Management COM
## 8.1 Problème
client ≠ serveur
---
## 8.2 Solution
---
## 8.3 Règle
celui qui reçoit libère
---
# 9) Conversion GUID
## 9.1 GUID → string
## 9.2 string → GUID
---
# 10) Fonctions utiles
---
# 11) Macros d’interface
permet compatibilité C / C++
---
# 12) Ce qu’il faut retenir
COM repose sur :
* HRESULT → erreurs avancées
* GUID → identité
* Registry → localisation
* COM Library → runtime
---
# Niveau réel
Si tu maîtrises ce chapitre :
tu comprends :
* pourquoi COM existe
* comment Windows localise un composant
* comment les erreurs sont gérées
et ça… c’est déjà niveau avancé
Salut
Ici on ne crée pas encore d’objets (ça sera le chapitre factory)
Ici on comprend **les fondations système** :
* HRESULT (gestion erreurs COM)
* GUID (identité globale)
* Registry (où COM trouve les objets)
* Fonctions de la COM Library
Objectif : comprendre comment COM fonctionne réellement en interne.
---
# 1) HRESULT : le système d’erreur COM
## 1.1 Pourquoi HRESULT existe
En C/C++ classique :
Code: Select all
bool success;
* pas d’info
* pas d’origine
* pas scalable
COM utilise :
Code: Select all
HRESULT
## 1.2 Structure interne (TRÈS IMPORTANT)
Un HRESULT est un entier 32 bits :
Code: Select all
| Severity | Facility | Code |
* Facility (15 bits) → origine (Win32, RPC, COM…)
* Code (16 bits) → code erreur
Exemple mental :
Code: Select all
0x80070005
* 7 → Win32
* 5 → Access denied
---
## 1.3 Codes importants
Code: Select all
S_OK
S_FALSE
E_FAIL
E_OUTOFMEMORY
E_NOINTERFACE
E_NOTIMPL
S_FALSE = succès
---
## 1.4 SUCCEEDED / FAILED
NE JAMAIS faire :
Code: Select all
if(hr == S_OK)
Faire :
Code: Select all
if (SUCCEEDED(hr))
## 1.5 Plusieurs codes possibles
Une fonction peut retourner :
* plusieurs succès
* plusieurs erreurs
donc :
COM ≠ booléen
---
## 1.6 Définir ses propres HRESULT
Code: Select all
MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 100)
* utiliser FACILITY_ITF
---
## 1.7 Les erreurs peuvent changer
un composant peut évoluer
nouveaux codes ajoutés
donc client doit :
gérer les erreurs inconnues
---
## 1.8 HRESULT et réseau
COM peut être distant
donc HRESULT permet :
* signaler erreurs réseau
* différencier origine
---
# 2) GUID : identité globale
## 2.1 Définition
GUID = identifiant unique 128 bits
Code: Select all
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
## 2.2 Pourquoi GUID
problème : collisions
solution :
unicité globale (machine + temps + random)
---
## 2.3 Génération
Code: Select all
CoCreateGuid
* guidgen.exe
---
## 2.4 GUID en mémoire
Code: Select all
struct GUID
---
## 2.5 Déclaration GUID
Code: Select all
DEFINE_GUID(...)
---
## 2.6 Comparaison GUID
Code: Select all
IsEqualGUID
## 2.7 GUID par référence
Code: Select all
typedef const GUID& REFIID;
---
## 2.8 GUID et COM
* CLSID → classe
* IID → interface
---
# 3) Registry COM
## 3.1 Pourquoi le registry
COM doit être dynamique
indépendant du code
---
## 3.2 Structure principale
Code: Select all
HKEY_CLASSES_ROOT
└── CLSID
└── {GUID}
├── InprocServer32
├── ProgID
└── VersionIndependentProgID
## 3.3 InprocServer32
Code: Select all
C:\MonComposant.dll
* DLL
* threading model
---
## 3.4 ProgID
Code: Select all
MonApp.Component
---
## 3.5 VersionIndependentProgID
évite dépendance version
---
## 3.6 Organisation réelle
CLSID → info technique
ProgID → mapping humain
---
# 4) Enregistrement COM
## 4.1 regsvr32
Code: Select all
regsvr32 mon.dll
Code: Select all
DllRegisterServer
## 4.2 Implémentation
API utilisées :
Code: Select all
RegCreateKeyEx
RegSetValueEx
RegDeleteKey
RegCloseKey
## 4.3 Self-registration
DLL s’enregistre elle-même
---
# 5) Component Categories
permet :
* classer composants
* filtrer
via CATID
---
# 6) OleView
outil pour explorer COM
* CLSID
* interfaces
* catégories
---
# 7) COM Library
## 7.1 Initialisation
Code: Select all
CoInitialize(NULL);
Code: Select all
CoInitializeEx(NULL, COINIT_MULTITHREADED);
## 7.2 Règles
1 fois par thread
CoUninitialize ensuite
---
# 8) Memory Management COM
## 8.1 Problème
client ≠ serveur
---
## 8.2 Solution
Code: Select all
CoTaskMemAlloc
CoTaskMemFree
## 8.3 Règle
celui qui reçoit libère
---
# 9) Conversion GUID
## 9.1 GUID → string
Code: Select all
StringFromGUID2
Code: Select all
CLSIDFromString
# 10) Fonctions utiles
Code: Select all
StringFromCLSID
StringFromIID
CLSIDFromString
IIDFromString
# 11) Macros d’interface
Code: Select all
DECLARE_INTERFACE
---
# 12) Ce qu’il faut retenir
COM repose sur :
* HRESULT → erreurs avancées
* GUID → identité
* Registry → localisation
* COM Library → runtime
---
# Niveau réel
Si tu maîtrises ce chapitre :
tu comprends :
* pourquoi COM existe
* comment Windows localise un composant
* comment les erreurs sont gérées
et ça… c’est déjà niveau avancé