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 eingetretenMir 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