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 porte 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 connaissance de 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 unique 128 bits, que le serveur doit inscrire. COM utilise ce CLSID, à la demande d’un client, pour associer des données spécifiques à la DLL ou 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 tous les besoins du client. 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 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 pour une utilisation par un client. Bien que les applications ne connaissent que le CLSID d’un serveur, car ils 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, 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 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 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’interfaceIClassFactory, 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 IClassFactory, consultez Implémentation d’IClassFactory.)
Note
Les serveurs qui prennent en charge une autre interface de fabrique de classes personnalisée ne sont pas nécessaires pour prendre en charge IClassFactory spécifiquement. Toutefois, les appels aux fonctions d’activation autres que CoGetClassObject (par exemple, 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 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 accepte un param riid qui spécifie le pointeur d’interface souhaité du client.)
Note
COM n’a que quelques fonctions sur lesquelles beaucoup d’autres sont construits. La plus importante est 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 effectuer tout travail avec l’objet souhaité. À l’aide des fonctions de base de COM, le client doit également prendre soin de 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 sont liés à 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 de création d’instance.
Rubriques connexes