2009-01-18 11 views
1

Sans:Réception d'événements COM

  • ATL
  • MFC

Note:

  • plaine C++
  • Out-of-process objet COM/serveur
  • fichier TLB Prédéfini

Question:

  • Comment implémenter une interface sortante , de sorte que l'objet COM peut notifier à l'évier des événements?
  • Comment gérer l'événement de manière appropriée, une fois reçu?

est inférieure à la fonction d'événement que je voudrais mettre en œuvre - de fichier TLB:

inline HRESULT IS8SimulationEvents::S8SimulationEndRun () { 
    HRESULT _result = 0; 
    _com_dispatch_method(this, 0x2, DISPATCH_METHOD, VT_ERROR, (void*)&_result, NULL); 
    return _result; 
} 

Cordialement

Répondre

2

implémentent l'interface source dans la classe COM Server. Vous devez implémenter IConnectionPointcontainer si vous n'utilisez pas l'ATL.

Dans la classe client, appelez le serveur COM comme indiqué ci-dessous. 1. Appelez FindConnectionPointContainer 2. Appelez FindConnectionPoint 3. Appelez Advise sur le pointeur d'interface renvoyé à partir de l'étape 2, nous devrions fournir le pointeur IUnknown de l'objet sink. Advise retourne un cookie, que nous pouvons utiliser tout en appelant l'inattendu. Pour gérer les événements, vous pouvez le faire de deux manières: l'une utilisant la méthode Invoke d'IDispatch pour résoudre les appels côté client autre est le serveur lui-même appelle la méthode Sink particulière. Les deux la méthode utilise le pointeur IUnknown qu'il obtient tout en conseillant.

+0

Comment puis-je confirmer que l'objet COM a déjà une interface source? Je travaille avec un fichier TLB prédéfini. – Aaron

+0

Trouvé "dispinterface IS8SimulationEvents" - helpstring ("Interface d'événements pour l'objet S8Simulation"). Est-ce ceci? – Aaron

+0

Habituellement, les interfaces avec "Events" sont des interfaces de puits qui signifient "Doit être implémenté par le client" et l'interface qui se trouve au dessus de cette interface est l'interface source – Vinay