Partager via


Objets de classe COM et CLSID

Un serveur COM est implémenté en tant que classe COM. Une classe COM est une implémentation d’un groupe d’interfaces dans le code exécutée chaque fois que vous interagissez avec un objet donné. Il existe une distinction importante entre une classe C++ et une classe COM : en C++, une classe est un type, tandis qu’une classe COM est simplement une définition de l’objet et n’a aucun type, bien qu’un programmeur C++ puisse l’implémenter à l’aide d’une classe C++. COM est conçu pour permettre à une classe d’être utilisée par différentes applications, y compris les applications écrites sans connaître l’existence de cette classe particulière. Par conséquent, le code de classe d’un type donné d’objet existe dans une bibliothèque liée dynamique (DLL) ou dans une autre application exécutable (EXE).

Chaque classe COM est identifiée par un CLSID, un GUID 128 bits unique, que le serveur doit inscrire. COM utilise ce CLSID, à la demande d’un client, pour associer des données spécifiques à la DLL ou à l’EXE contenant le code qui implémente la classe, créant ainsi une instance de l’objet.

Pour les clients et les serveurs sur le même ordinateur, le CLSID du serveur est tout ce dont le client a besoin. Sur chaque ordinateur, COM gère une base de données (elle utilise le registre système sur les plateformes Microsoft Windows et Macintosh) de tous les CLSID pour les serveurs installés sur le système. Il s’agit d’un mappage entre chaque CLSID et l’emplacement de la DLL ou de l’EXE qui héberge le code de ce CLSID. COM consulte cette base de données chaque fois qu’un client souhaite créer un instance d’une classe COM et utiliser ses services, de sorte que le client n’a jamais besoin de connaître l’emplacement absolu du code sur l’ordinateur.

Pour les systèmes distribués, COM fournit des entrées de Registre qui permettent à un serveur distant de s’inscrire lui-même pour une utilisation par un client. Bien que les applications n’ont besoin de connaître que le CLSID d’un serveur, car elles peuvent s’appuyer sur le Registre pour localiser le serveur, COM permet aux clients de remplacer les entrées de Registre et de spécifier les emplacements du serveur, afin de tirer pleinement parti du réseau. (Voir Localisation d’un objet distant.)

La méthode de base pour créer un instance d’une classe consiste à utiliser un objet de classe COM. Il s’agit simplement d’un objet intermédiaire qui prend en charge les fonctions communes à la création d’instances d’une classe donnée. La plupart des objets de classe utilisés pour créer des objets à partir d’un CLSID prennent en charge l’interface IClassFactory , une interface qui inclut la méthode CreateInstance importante. Vous implémentez une interface IClassFactory pour chaque classe d’objet que vous proposez d’instancier. (Pour plus d’informations sur l’implémentation d’IClassFactory, consultez Implémentation d’IClassFactory.)

Notes

Les serveurs qui prennent en charge une autre interface de fabrique de classe personnalisée ne sont pas nécessaires pour prendre en charge IClassFactory spécifiquement. Toutefois, les appels à des fonctions d’activation autres que CoGetClassObject (telles que CoCreateInstanceEx) nécessitent que le serveur prend en charge IClassFactory.

 

Lorsqu’un client souhaite créer une instance de l’objet du serveur, il utilise le CLSID de l’objet souhaité dans un appel à CoGetClassObject. (Cet appel peut être direct ou implicite, via l’une des fonctions d’assistance à la création d’objets.) Cette fonction localise le code associé au CLSID, crée un objet de classe et fournit un pointeur vers l’interface demandée. (CoGetClassObject prend un paramètre riid qui spécifie le pointeur d’interface souhaité du client.)

Notes

COM n’a que quelques fonctions sur lesquelles de nombreuses autres sont basées. Le plus important d’entre eux est probablement CoGetClassObject, qui sous-tend toutes les fonctions de création instance.

 

Avec ce pointeur, l’appelant peut créer une instance de l’objet et récupérer un pointeur vers une interface demandée sur l’objet . Il s’agit généralement d’une interface d’initialisation, utilisée pour activer l’objet (le placer dans l’état d’exécution) afin que le client puisse effectuer le travail qu’il souhaite avec l’objet qu’il souhaite. À l’aide des fonctions de base de COM, le client doit également veiller à libérer tous les pointeurs d’objet.

Un autre mécanisme d’activation des instances d’objet consiste à utiliser le moniker de classe. Les monikers de classe se lient à l’objet de classe de la classe pour laquelle ils sont créés. Pour plus d’informations, consultez Monikers de classe.

COM fournit plusieurs fonctions d’assistance qui réduisent le travail de création d’instances d’objet. Celles-ci sont décrites dans Fonctions d’assistance à la création d’instance.

Création d’un objet par le biais d’un objet Class