La classe de modèle IDispEventImpl peut être utilisée pour fournir un soutien aux points de connexion dans votre objet COM ATL. Un point de connexion permet à votre objet COM gérer les événements déclenchés à partir d'objets COM externes. Ces points de connexion sont mappées avec une carte de récepteur d'événement, fournie par votre objet COM.
Pour bien mettre en œuvre un point de connexion ou de points pour votre objet COM, les étapes suivantes doivent être remplies:
Dans cette procédure, vous modifiera uniquement le fichier d'en-tête (.h) de votre classe COM.
Pour chaque objet externe dont vous souhaitez gérer les événements, vous devez importer la bibliothèque de types. Cette étape définit les événements qui peuvent être manipulés et fournit de l'information qui est utilisée lors de la déclaration de la carte d'évier événement. La directive # import peut servir à cela. Ajouter les lignes de la directive nécessaire # import pour chaque interface de dispatch que vous soutiendrez le fichier d'en-tête (.h) de votre classe COM.
L'exemple suivant importe la bibliothèque de type d'un serveur COM externe ( MyServer ):
# import "D:\MyServer.dll" raw_interfaces_only, no_namespace, named_guids
&Notenbsp ; Vous devez disposer d'une déclaration distincte # import pour chaque interface de dispatch externe que vous soutiendrez.
Maintenant que vous avez importé des bibliothèques de types de chaque interface de dispatch, vous devez déclarer des interfaces IDispEventImpl distincts pour chaque interface de dispatch externe. Modifiez la déclaration de votre classe COM en ajoutant une déclaration d'interface IDispEventImpl pour chaque objet externe. Pour plus d'informations sur les paramètres, consultez IDispEventImpl.
Les lignes suivantes de code déclarent deux points de connexion, de la coutume IExtEvents1 et IExtEvents2 , pour l'objet COM implémentée par la classe des interfacesCMyObj:
public IDispEventImpllt; 0, CMyObj, & DIID__IExtEvents1,
& LIBID_EXTEVENTS1Lib, 1, 0 >,
public IDispEventImpl < 1, CMyObj, & DIID__IExtEvents2,
& LIBID_EXTEVENTS2Lib, 1, 0 & gt
Pour que les notifications d'événement sera traitée par le bon fonctionnement, votre objet COM doit route chaque événement à son gestionnaire correct. Ce résultat est obtenu en déclarant une carte d'évier événement.
ATL fournit plusieurs macros, BEGIN_SINK_MAP, END_SINK_MAPet SINK_ENTRY, qui facilitent cette cartographie. Le format standard est la suivante:
BEGI&N_SINK_MAP(ComClass)
nbsp ; SINK_ENTRY (id, dispid, func)
... entrées d'événement externe //additional
END_SINK_MAP()
L'exemple suivant déclare une carte de récepteur d'événement avec deux gestionnaires d'événements:
BEGIN_SINK_MAP(CMyObj)
SINK_ENTRY (0, évènementsa, OnClick1)
SINK_ENTRY (0, Events2, OnClick2)
END_SINK_MAP()
La mise en œuvre est presque terminé. La dernière étape concerne le conseiller et de désinformer les interfaces externes.
La dernière étape consiste à mettre en œuvre une méthode qui va Conseiller (ou désinformation) tous les points de connexion aux moments appropriés. Ce conseiller doit être fait avant que la communication entre les clients de l'extérieur et votre objet peut avoir lieu. Avant que votre objet devient visible, chaque interface de dispatch externes pris en charge par votre objet est interrogée pour les interfaces sortantes. Une connexion est établie et une référence à l'interface sortante est utilisée pour gérer les événements du contrôle. Cette procédure est appelée « conseiller ».
Après que votre objet est fini avec les interfaces externes, les interfaces sortants devraient être avisés qu'ils ne sont plus utilisés par votre objet COM. Ce processus est appelé la « désinformation ».
En raison de la nature unique des objets COM, cette procédure varie, en détail et de l'exécution, entre les implémentations. Ces détails sont hors de la portée de cette rubrique et ne sont pas abordées.