2010-01-22 5 views
5

Ich habe die 'Tutorials' zum Bereitstellen eines .NET-Framework über COM (http://msdn.microsoft.com/en-us/library/zsfww439.aspx und http://msdn.microsoft.com/en-us/library/bd9cdfyx.aspx) folgen. Alles funktioniert bis auf den Eventteil. Wenn ich Ereignisse an dem C# Schnittstelle den folgenden C++ Code hinzufügen, wird generiert:Registrieren von Handlern für .NET COM-Ereignis in 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; 
} 

Das Problem ist, dass ich keine Informationen über gefunden habe, wie dies ++ in C zu verwenden. Muss ich von _MessageEventHandler ableiten und operator() implementieren? Oder etwas ganz anderes?

(Beachten Sie, dass für den Moment, wo ich auch bin versucht, die mehr dokumentierter Ansatz von IConnectionPointContainer und IConnectionPoint verwenden.)

+0

Wahrscheinlich haben Sie erwartet, dass Sie von '_MessageEventHandler' ableiten und einen Aufruf von' IDispatch :: Invoke() 'für das Ereignis erhalten - aber die Frage ist, was' DISPID'? –

Antwort

2

Es ist schon eine lange Zeit, da ich COM verwendet und zu diesem Zeitpunkt war ich mit Visual C++ 6.0 . Ich erinnere mich, dass das Implementieren von Senken für COM-Verbindungspunkte kein einfacher Prozess war. Es gab mehrere Möglichkeiten, sie zu implementieren, abhängig davon, ob Sie MFC oder ATL verwendet haben. Vielleicht gibt es jetzt einfachere Möglichkeiten. Hier sind einige Links, die Ihnen helfen:

Code Project - Sinking events from managed code in unmanaged C++
Code Project - COM - große Anzahl von Artikeln über COM
Code Project - Handling COM Events in a Console Application
Code Project - Handling COM Events in a Console Application, Part II

+0

Thx. Der erste Link zeigte mir die 'fehlenden Teile' :-) –

1

IDispatch verwendet wird zur Laufzeit verbindlich Sprachen wie VB, würden Sie normalerweise nicht muss dies für eine stark typisierte Sprache wie C# tun.

Wenn Sie eine Methode über IDispatch aufrufen, erstellen Sie tatsächlich ein Array, das die Methoden-ID (dispid) und Parameter enthält, und übergeben diese dann an eine Funktion, die eine Tabelle mit Methoden nach dispid durchsucht Findet einen, es verwendet Ihr Parameterarray, um einen Aufrufstapel zu erstellen, und ruft dann die Methode auf. (Dies ist natürlich eine zu starke Vereinfachung).

Wenn Sie also wissen, dass eine Klasse IDispatch implementiert, sagt Ihnen das fast nichts.

Das ist also ein falscher Hinweis, oder Sie fehlen die Deklaration für die MessageEventHandler-Versandtabellen.

Es ist überhaupt nicht überraschend, dass Sie nicht herausfinden können, wie Sie dies implementieren, Sie fehlen einige wichtige Informationen.