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 ichfuntion entered
one more thread aliveDanach 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...