Callbackfunktion wird nicht aufgerufen
-
Hallo.
Ich habe hier eine unmanaged C++ DLL welche folgende Funktion zur Registrierung einer Callback-Funktion exprotiert.
int i_APCI1500_SetBoardIntRoutineWin32( unsigned char b_BoardHandle, unsigned char b_UserCallingMode, unsigned long ul_GlobalBufferSize, void** ppv_UserGloablBuffer, void (far pascal * v_FunctionName) (unsigned char b_BoardHandle, unsigned char b_InterruptMask, unsigned char b_InputChannelNbr, unsigned char b_UserCallingMode, void* pv_UserSharedMemory));
Jetzt lege ich eine delegate Funktion in C# an:
public delegate void InterruptRoutine( byte BoardHandle, byte InterruptMask, byte InputChannelNbr, byte UserCallingMode, IntPtr UserSharedMemory);
und importiere die Funktion
[DllImport("Apci1500.Dll)] private static extern int i_APCI1500_SetBoardIntRoutineWin32( byte BoardHandle, byte UserCallingMode, ulong GlobalBufferSize, out IntPtr UserGlobalBuffer, InterruptRoutine IR);
meine eigene Callbackfunktion:
private static void InterruptRoutineCB( byte BoardHandle, byte InterruptMask, byte InputChannelNbr, byte UserCallingMode, IntPtr UserSharedMemory) { MessageBox.Show("Event","APCI-Event"); }
und der Aufruf der importierten Funktion
IntPtr ptr = IntPtr.Zero; InterruptRoutine interruptroutine = new InterruptRoutine(InterruptRoutineCB); int rc = i_APCI1500_SetBoardIntRoutineWin32( _boardhandle, _usercallingmode, 0, out ptr, _interruptroutine);
rc ist im Fehlerfall != 0 hier bekomme ich aber 0 zurück.
Trotzdem wird meine Callbackfunktion nie aufgerufen.
Woran kann das liegen. Wo ist der Fehler?Verge
-
Bist du dir sicher, dass du einfach das Delegate übergeben kannst. Habe noch nicht viel mit Callbacks aus unmanaged Code gemacht, aber ich glaube du musst nicht das Delegate sondern einen IntPtr an deinen C++ code übergeben. Dein Problem ist, dass im unmanaged Bereich zwar etwas ankommt, was aber vermutlich nur eine Kopie des Delegates ist. Deshalb bekommst du auch 0 zurück und trotzdem wird die Methode nicht aufgerufen. Zum IntPtr kommst du über
Marshal.GetFunctionPointerForDelegate(Delegate d);
Dann sollte es eigentlich funktionieren.
Hoffe es hilft dir weiter.
-
Habs zwar jetzt schon anders gelöst aber ich probier das mal aus.
Danke!