2009-07-06 5 views
4

J'essaie d'écrire une bibliothèque gérée en C# qui servira de source d'événement pour un récepteur d'événements C++ existant. Le problème que j'ai est que lorsque l'application non gérée appelle AtlAdvise pour obtenir la carte de point de connexion pour ma bibliothèque, elle reçoit l'erreur "0x80040200" (CONNECT_E_NOCONNECTION) - Il y a quelques articles MSDN concernant cette erreur qui sont liés à non géré < -> communication non gérée et une carte de point de connexion non valide dans le serveur COM, mais rien à propos d'un serveur COM géré.connexion d'une source d'événement gérée à un récepteur d'événements non géré

J'ai chargé le IDL à partir d'un serveur C++ non géré qui fonctionne et a obtenu une liste des événements qui sont exposés et a ensuite créé ces mêmes événements dans mon code en procédant comme suit:

dll Créé contenant les interfaces I doivent mettre en œuvre

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIDispatch), Guid("xxxxxx")] 
public interface IMyInterface 
{ 
    ... 
    methods here 
    ... 

dll qui a créé la classe qui implémente les 3 interfaces requises

[Guid("xxxxxxx2")] 
[ComSourceInterfaces(typeof(IMyInterface), typeof(IMyOtherInterface), typeof(IMyThirdInterface))] 
public class DeviceTranslator : IDisposable, IMyInterface, IMyOtherInterface, IMyThirdInterface 
{ 

créé Deleg Ates dans l'espace de noms de l'interface gérée

namespace myNS.Interfaces 
{ 
    public delegate void DistributeMessage([In] ref OLDMESSAGE Message); 

et événements créés dans la IMyInterface réelle

event DistributeMessage myDistributeMessage; 

dans ma classe I mis en œuvre l'événement: événement public DistributeMessage myDistributeMessage;

Je peux placer un point d'arrêt dans mon constructeur, voir que la DLL est chargée correctement, mais quand ce morceau de code non géré est appelé, j'obtiens l'erreur référencée ci-dessus: (pDistributeSink est un cast CEventSink à un IUnknown *, et GUID pour IID_IDistributeEvent est le même GUID que IMyInterface)

hr = AtlAdvise(m_pUnknown, pDistributeSink, IID_IDistributeEvent, &m_dwConnectionPointCookie); 

a ce stade, je me gratte totalement la tête et ne comprends pas ce que AtlAdvise a besoin pour obtenir sa carte de point de connexion retour du CLR ...

Répondre

4

J'ai donc attendu 5 jours, en faisant tourner mes roues tous les jours sans pouvoir m'en rendre compte avant de la lancer e, et maintenant une heure plus tard, je l'ai compris ... allez comprendre.

Voici ce que je devais faire (un grand merci à codeproject)

je héritant de l'interface d'événement sortant (IMyInterface) et définir dans mon attribut ClassInterface. . J'avais aussi créé les délégués au sein de l'espace de noms IMyInterface est, et non pas l'espace de noms de la classe DeviceTranslator est

Il se trouve que je devais:

  • qu'ils définissent ce dans l'attribut ClassInterface et alors pas remplacer les méthodes dans cette interface .

  • Créer des délégués dans ma classe espace de noms bibliothèque qui correspondent aux signatures de méthode de IMyInterface exactement (qui correspondent à l'événement COM méthodes client évier)

  • créer des événements au sein de la classe DeviceTranslator qui sont nommés exactement les mêmes que les méthodes IMyInterface

Il est expliqué très w ell dans le lien j'ai posté ci-dessus et a été le premier endroit qui l'a vraiment couler dans la façon dont tout fonctionne vraiment et ce qui doit être créé où.

3

Je crois que c'est le lien CodeProject correct: http://www.codeproject.com/KB/COM/cominterop.aspx#NetEvents

+0

Donc, il y a exactement un exemple sur le web sur la façon de le faire? Où d'autre est cette chose documentée? Ou dois-je aller fouiller dans ma bibliothèque locale pour un de ces livres de 1000 pages avec le grand "COM" dans le titre? –

+1

@HaiPhan Cela fait un moment que je devais y plonger (c'était la dernière fois il y a environ 6 ans quand j'ai fait cette réponse), mais je me souviens que la documentation sur msdn et sur le web en général était rare. Je doute que cela se soit amélioré, surtout si cela concerne COM car c'est une technologie assez ancienne maintenant. Mais si vous trouvez de bonnes pièces en utilisant votre google-fu, je suis sûr que vous allez aider quelqu'un si vous publiez le (s) lien (s) ici :) – TGasdf

Questions connexes