Cours sur COM [HRESULT, GUID, REGISTRY]

Ce forum est dédié à l'apprentissage de com comme par exemple directX , mediafoundation , les bases de com ....

Moderator: Rick

Post Reply
Hydraxx
Site Admin
Posts: 19
Joined: Mon Jan 12, 2026 4:04 pm
Location: France
Contact:

Cours sur COM [HRESULT, GUID, REGISTRY]

Post by Hydraxx »

# COM : HRESULT, GUID, REGISTRY

Salut :D 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 :

Code: Select all

bool success;
Problème :

* 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 |
* Severity (1 bit) → succès / échec
* Facility (15 bits) → origine (Win32, RPC, COM…)
* Code (16 bits) → code erreur

Exemple mental :

Code: Select all

0x80070005
* 8 → erreur
* 7 → Win32
* 5 → Access denied

---

## 1.3 Codes importants

Code: Select all

S_OK
S_FALSE
E_FAIL
E_OUTOFMEMORY
E_NOINTERFACE
E_NOTIMPL
Piège CRITIQUE :

S_FALSE = succès

---

## 1.4 SUCCEEDED / FAILED

NE JAMAIS faire :

Code: Select all

if(hr == S_OK)
car il existe plusieurs succès

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)
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

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
ou outil :

* guidgen.exe

---

## 2.4 GUID en mémoire

Code: Select all

struct GUID
structure binaire fixe

---

## 2.5 Déclaration GUID

Code: Select all

DEFINE_GUID(...)
avec INITGUID

---

## 2.6 Comparaison GUID

Code: Select all

IsEqualGUID
---

## 2.7 GUID par référence

Code: Select all

typedef const GUID& REFIID;
é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

Code: Select all

HKEY_CLASSES_ROOT
└── CLSID
└── {GUID}
├── InprocServer32
├── ProgID
└── VersionIndependentProgID
---

## 3.3 InprocServer32

Code: Select all

C:\MonComposant.dll
indique :

* DLL
* threading model

---

## 3.4 ProgID

Code: Select all

MonApp.Component
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

Code: Select all

regsvr32 mon.dll
appelle :

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);
ou

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
## 9.2 string → GUID

Code: Select all

CLSIDFromString
---

# 10) Fonctions utiles

Code: Select all

StringFromCLSID
StringFromIID
CLSIDFromString
IIDFromString
---

# 11) Macros d’interface

Code: Select all

DECLARE_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é

Who is online

Users browsing this forum: No registered users and 1 guest