Obtention d’un pointeur vers un objet

Comme COM n’a pas de modèle de classe strict, il existe quatre façons pour un client d’instancier ou d’obtenir un pointeur vers une interface sur un objet :

  • Appelez une fonction de bibliothèque COM qui crée un objet d’un type prédéterminé ; autrement dit, la fonction retourne un pointeur vers une seule interface spécifique pour une classe d’objet spécifique.
  • Appelez une fonction de bibliothèque COM qui peut créer un objet basé sur un identificateur de classe (CLSID) et qui retourne n’importe quel type de pointeur d’interface demandé.
  • Appelez une méthode d’une interface qui crée un autre objet (ou se connecte à un objet existant) et retourne un pointeur d’interface sur cet objet distinct.
  • Implémentez un objet avec une interface via laquelle d’autres objets passent directement leur pointeur d’interface au client.

Pour plus d’informations sur l’obtention de pointeurs vers d’autres interfaces sur un objet après avoir le premier, consultez QueryInterface : navigation dans un objet.

Création d’un objet d’un type prédéterminé

Il existe de nombreuses fonctions COM, telles que CoGetMalloc, qui retournent des pointeurs vers des implémentations d’interface spécifiques. (CoGetMalloc récupère un pointeur vers l’allocateur de mémoire COM standard.) La plupart d’entre elles sont des fonctions d’assistance, et la plupart de ces fonctions sont décrites dans les sections de référence de cette documentation, sous la zone spécifique à laquelle elles sont liées, comme le stockage ou le transfert de données.

Création d’un objet basé sur un CLSID

Il existe plusieurs fonctions que, avec un CLSID, un client peut appeler pour créer un objet instance et obtenir un pointeur vers celui-ci. Toutes ces fonctions sont basées sur la fonction CoGetClassObject, qui crée un objet de classe et fournit un pointeur vers une interface qui vous permet de créer des instances de cette classe. Bien qu’il doit y avoir des informations indiquant le système sur lequel réside le serveur, il n’est pas nécessaire que ces informations soient contenues dans le client. Le client doit connaître uniquement le CLSID et jamais le chemin absolu du code du serveur. Pour plus d’informations, consultez Création d’un objet via un objet de classe.

Renvoi d’un pointeur vers un objet distinct

Parmi les nombreuses méthodes d’interface qui retournent un pointeur vers un objet distinct, plusieurs créent et retournent un pointeur vers un objet énumérateur, ce qui vous permet de déterminer le nombre d’éléments d’un type donné qu’un objet conserve. COM définit des interfaces pour énumérer un large éventail d’éléments, tels que des chaînes, des structures importantes, des monikers et des pointeurs d’interface IUnknown . La façon classique de créer un énumérateur instance et d’obtenir un pointeur vers son interface consiste à appeler une méthode à partir d’une autre interface. Par exemple, l’interface IDataObject définit deux méthodes, EnumDAdvise et EnumFormatEtc, qui retournent des pointeurs vers des interfaces sur deux objets d’énumération différents. Il existe de nombreux autres exemples dans COM de méthodes qui retournent des pointeurs vers des objets, comme l’interface de document composé OLE IOleObject::GetClientSite, qui, lorsqu’elle est appelée sur l’objet incorporé ou lié, retourne un pointeur vers l’implémentation D’IOleClientSite de l’objet conteneur.

Implémentation d’un objet via lequel passer un pointeur d’interface directement au client

Lorsque deux objets, tels qu’un conteneur de documents composés OLE et un serveur, ont besoin d’une communication bidirectionnelle, chacun implémente un objet contenant une méthode d’interface par laquelle il peut passer un pointeur d’interface vers l’autre objet. L’objet d’implémentation, qui est également le client de l’objet créé, peut ensuite appeler la méthode et obtenir le pointeur passé.

Clients et serveurs COM

Responsabilités du serveur COM