Void Zeiger / Event Handler
-
Hallo,
ich baue einen wrapper (c++/cli) um eine native c++ dll, um aus einer managed umgebung wie C#/.NET diese verwenden zu können.
Dabei spricht die native dll externe Hardware an und liefert zu bestimmten zeitpunkten ein Ereignis.
der c++ code sieht schematisch wie folgt aus:
typedef void *HANDLE; HANDLE hEvent; // create the event handle hEvent = ::CreateEvent(NULL,FALSE,FALSE,NULL); // inform the api that the event should be used informAPIToUseThisEvent(hEvent); DWORD dwResult = ::WaitForSingleObject(hEvent, 500) if(dwResult == WAIT_OBJECT_0 || WAIT_TIMEOUT) DoSomething(); // Event eingetreten
Mir gelingt es nicht, das Event irgendwie in die managed welt zu "wrappen" und meiner C# Anwendung weiter zu verarbeiten. Über einen Tipp oder Ratschlag wäre ich sehr dankbar!
Viele Grüße
jla
-
Hoffe das hilft Dir weiter...
Du könntest ja eine Klasse aus dem CLI assembly exportieren, das verschiedene EventWrapper properties hat und Dich dann auf deren Events registrieren.#include "Windows.h" using namespace System; typedef void *HANDLE; public delegate void EventDelegate(); public ref class MyEventWrapper { public: MyEventWrapper(HANDLE eventToListen) :hEvent(eventToListen) { } event EventDelegate^ Event; void Start() { while (true) { DWORD dwResult = ::WaitForSingleObject(hEvent, 1000); if(dwResult == WAIT_OBJECT_0 || WAIT_TIMEOUT) Event(); } } private: HANDLE hEvent; }; void MyEventHandler() { Console::WriteLine("Hello Event"); } void IchKoennteAuchCSSein(MyEventWrapper^ eventWrapper) { eventWrapper->Event += gcnew EventDelegate(&MyEventHandler); } int main(array<System::String ^> ^args) { HANDLE hEvent = ::CreateEvent(NULL,FALSE,FALSE,NULL); MyEventWrapper^ wrapper = gcnew MyEventWrapper(hEvent); IchKoennteAuchCSSein(wrapper); wrapper->Start(); //hier komme ich nicht mehr hin, //weil ich jetzt keinen extra thread machen mag return 0; }
-
Besten Dank, ich habe einen kleinen Prototypen geschrieben und es funktioniert. Ich habe bei der ganzen Problematik immer nach einem managed Gegenstück gesucht, dabei aber total den Vorteil von C++/CLI vergessen managed und unmanged gleichzeitig verwenden zu können und somit auch Delegates und Events aus dem .NET Framework zu verwenden... (peinlich )
danke für deine lösung und die schnelle antwort!!!!!
viele grüße
jla