Function Pointer von Managed an unmanaged Code übergeben



  • Hi,

    ich habe eine Menge gegoogelt, aber nichts konnte mir weiterhelfen. Hier Mein Problem:

    Ich habe eine c++ .lib mit einer Funktion

    Tuwas( void callback(size_t,const char*) ){
      callback(0,"funtion entered");
      #pragma omp parallel
      {
        callback(0,"one more thread alive");
    ...
      }
    ...
    }
    

    Diese möchte ich aus Managed c++ Code aufrufen, das tue ich bisher wie folgt:

    Vor meinem ref class MyClass habe ich ein

    delegate void CallbackDelegate( size_t perc, const char* msg );
    

    ,

    dann in der MyClass Klasse:

    private: CallbackDelegate^ CallbackD;
    

    Sowie im Konstruktor

    CallbackD = gcnew CallbackDelegate(this,&MyClass::callbackfcn);
    

    Die callbackfcn ist einen member Funktion die ein Event ProgressChanged auslöst:

    void callbackfcn(size_t perc, const char* msg ){
    	Application::DoEvents();				
    	ProgressChanged( this, gcnew ProgressEventArgs(100,perc, gcnew String(msg)) );	
    }
    

    Die Funktion aus der Lib wird nun aufgerufen über:

    pin_ptr<CallbackDelegate^> tmp = &CallbackD;
    IntPtr callbackptr = Marshal::GetFunctionPointerForDelegate(CallbackD);
    void* callbackNativePtr = callbackptr.ToPointer();
    Tuwas( (void (__cdecl *)(size_t,const char *))callbackNativePtr );
    

    Die callbackfcn leitet nur ein char* weiter an das Hauptprogram über das Event.
    Dort wird der char* ausgegeben.
    Soweit so gut, als Ausgabe erhalte ich

    funtion entered
    one more thread alive

    Danach ist ende, entferne ich die omp Directive so stürzt das Programm nach dieser Ausgabe ab, mit der omp Directive scheint nur der 2. Thread abzustürzen
    und das Programm hängt einfach.

    Es sieht so aus, als ob entweder der Garbage collector dazwischen funkt, oder der delegat im speicher verschoben wird. Das sollte ja aber durch den pin_ptr verhindert werden. Hat hier einer eine Idee?

    Danke Schonmal vorab



  • an <private> liegt es nicht?

    private: CallbackDelegate^ CallbackD;

    ich würde mit <public> und <static> versuchen...


Anmelden zum Antworten