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


Anmelden zum Antworten