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é 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 ne comporte aucun type, bien qu’un programmeur C++ puisse l’implémenter à l’aide d’une classe C++. COM est conçu pour permettre l’utilisation d’une classe par différentes applications, y compris les applications écrites sans connaissance de l’existence de cette classe particulière. Par conséquent, le code de classe pour 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 situés sur le même ordinateur, le CLSID du serveur est tout ce dont a besoin le client. sur chaque ordinateur, COM gère une base de données (il 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 une 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. Alors que les applications ont besoin de connaître uniquement 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 des emplacements de serveur, afin de tirer pleinement parti du réseau. (Consultez localisation d’un objet distant.)

La méthode de base pour créer une instance d’une classe s’effectue via un objet de classe com. Il s’agit simplement d’un objet intermédiaire qui prend en charge les fonctions communes à la création de nouvelles 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 comprend la méthode CreateInstance importante. Vous implémentez une interface IClassFactory pour chaque classe d’objet que vous offrez pour être instanciée. (Pour plus d’informations sur l’implémentation de IClassFactory, consultez implémentation de IClassFactory.)

Notes

Les serveurs qui prennent en charge une autre interface de fabrique de classes personnalisée ne sont pas requis pour la prise en charge de IClassFactory spécifiquement. Toutefois, les appels aux fonctions d’activation autres que CoGetClassObject (par exemple CoCreateInstanceEx) requièrent que le serveur prenne 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 de création d’objet.) 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 la plupart des autres sont générées. Les plus importants sont probablement CoGetClassObject, qui sous-tend toutes les fonctions de création d’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 en cours d’exécution) afin que le client puisse faire tout ce qu’il veut avec l’objet. À 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 d’instances d’objet s’effectue par le biais du moniker de classe. Les monikers de classe sont liés à l’objet de classe de la classe pour laquelle ils sont créés. Pour plus d’informations, consultez monikers de classes.

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 de création d’instance.

Création d’un objet à l’aide d’un objet de classe