2010-01-22 13 views
5

Podążałem za "samouczkami" jak ujawnić framework .NET przez COM (http://msdn.microsoft.com/en-us/library/zsfww439.aspx i http://msdn.microsoft.com/en-us/library/bd9cdfyx.aspx). Wszystko działa z wyjątkiem części wydarzeń. Kiedy dodać zdarzeń do interfejsu C# następujący kod C++ jest generowany:Rejestrowanie procedur obsługi zdarzeń .NET COM w języku 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; 
} 

Problemem jest to, że nie znalazłem żadnej informacji o tym, jak korzystać z tego w C++. Czy muszę wyprowadzić z _MessageEventHandler i wdrożyć operator()? Lub coś zupełnie innego?

(Zauważ, że w tej chwili jestem również staramy się bardziej udokumentowane podejście korzystania IConnectionPointContainer i IConnectionPoint.)

+0

Prawdopodobnie spodziewałbyś się wyprowadzić z '_MessageEventHandler' i odebrać wywołanie' IDispatch :: Invoke() 'dla zdarzenia - ale pytanie brzmi, co to jest" DISPID "? –

Odpowiedz

2

To było dawno użyłem COM iw tym czasie używałem Visual C++ 6.0 . Pamiętam, że wdrażanie zlewów dla punktów połączeń COM nie było prostym procesem. Było wiele sposobów na ich wdrożenie, w zależności od tego, czy używałeś MFC czy ATL. Może teraz są łatwiejsze sposoby. Oto kilka linków, które mogą pomóc:

Code Project - Sinking events from managed code in unmanaged C++
Code Project - COM - duża liczba artykułów o COM
Code Project - Handling COM Events in a Console Application
Code Project - Handling COM Events in a Console Application, Part II

+0

Thx. Pierwszy link pokazał mi "brakujące części" :-) –

1

IDispatch służy do wykonawczych obowiązujących języków takich jak VB, byś normalnie nie trzeba to zrobić dla mocno napisanego języka, takiego jak C#.

Gdy wywołujesz metodę przez IDispatch, to, co faktycznie robisz, budujesz tablicę zawierającą identyfikator metody (zwaną dispid) i parametry, a następnie przekazujesz ją do funkcji, która przeszukuje tabelę metod przez dispid, kiedy wyszukuje jeden, wykorzystuje twoją tablicę parametrów do budowania callstack, a następnie wywołuje metodę. (Jest to oczywiście uproszczenie).

Więc wiedząc, że klasa implementuje IDispatch prawie nic nie mówi.

Więc to jest eterem fałszywy trop lub brakuje deklaracji dla tabel wysyłkowych MessageEventHandler.

Nie jest wcale zaskakujące, że nie możesz dowiedzieć się, jak wdrożyć od tego, brakuje niektórych istotnych informacji.

Powiązane problemy