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 ...
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? –
@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