2010-01-22 5 views
5

J'ai suivi les «tutoriels» sur la façon d'exposer un framework .NET via COM (http://msdn.microsoft.com/en-us/library/zsfww439.aspx et http://msdn.microsoft.com/en-us/library/bd9cdfyx.aspx). Tout fonctionne sauf pour la partie événements. Quand j'ajouter des événements à l'interface C# code C++ suivant est généré:Enregistrement de gestionnaires pour l'événement COM .NET en C++

struct __declspec(uuid("...")) 
_MessageEventHandler : IDispatch 
{}; 

struct __declspec(uuid("...")) 
IConnection : IDispatch 
{ 
    virtual HRESULT __stdcall add_MessageEvent (
    /*[in]*/ struct _MessageEventHandler * value) = 0; 
    virtual HRESULT __stdcall remove_MessageEvent (
    /*[in]*/ struct _MessageEventHandler * value) = 0; 
} 

Le problème est que je ne l'ai pas trouvé d'informations sur la façon d'utiliser en C++. Dois-je dériver de _MessageEventHandler et implémenter operator()? Ou quelque chose d'autre entièrement?

(Notez que pour le moment je suis aussi essayer l'approche plus documentée de l'utilisation IConnectionPointContainer et IConnectionPoint.)

+0

Vous pensiez probablement dériver de '_MessageEventHandler' et recevoir un appel sur' IDispatch :: Invoke() 'pour l'événement - mais la question est avec quel' DISPID'? –

Répondre

2

Il a été longtemps que je COM et à l'époque, je l'aide de Visual C++ 6.0 . Je me souviens que mettre en place des puits pour les points de connexion COM n'était pas un processus simple. Il y avait plusieurs façons de les implémenter, selon que vous utilisiez MFC ou ATL. Peut-être qu'il y a des moyens plus faciles maintenant. Voici quelques liens qui peuvent vous aider:

Code Project - Sinking events from managed code in unmanaged C++
Code Project - COM - grand nombre d'articles sur COM
Code Project - Handling COM Events in a Console Application
Code Project - Handling COM Events in a Console Application, Part II

+0

Thx. Le premier lien m'a montré les 'parties manquantes' :-) –

1

IDispatch est utilisé pour les langues de liaison d'exécution comme VB, vous ne serait pas normalement besoin de le faire pour un langage fortement typé comme C#. Lorsque vous appelez une méthode via IDispatch, vous créez un tableau contenant l'ID de méthode (appelé dispid) et les paramètres, puis vous le transmettez à une fonction qui parcourt une table de méthodes par dispid, quand elle trouve un, il utilise votre tableau de paramètres pour construire une callstack et ensuite appeler la méthode. (Ceci est une simplification excessive, bien sûr). Donc, savoir qu'une classe implémente IDispatch ne vous dit presque rien.

Il s'agit donc d'une fausse piste, ou il vous manque la déclaration pour les tables de répartition MessageEventHandler.

Il n'est pas du tout surprenant que vous ne puissiez pas comprendre comment implémenter cela, il vous manque des informations vitales.