merkwürdiger DllImport-Fehler

sTEk

Erfahrenes Mitglied
Hallo Gemeinde!


Ich habe einen sehr merkwürdigen Fehler beim Import einer DLL-Funktion, der jedoch definitiv bei mir liegt (die DLL funktioniert in einem C++ Programm tadellos).


Also, ich habe iene DLL, die einen seriellen Port öffnet und gerätespezifische Funktionen anbietet. In dieser DLL existiert auch eine Funktion, die bei einer bestimmten am seriellen Port empfangenen Sequenz eine bestimmte, selbst definierbare Funktion aufruft.
Das klappt so auch wunderbar - dummerweise nur einmal. Ich habe mit einem Portmonitor festgestellt, dass nach dem Aufruf meiner Funktion (Auswertung(...)) an der seriellen Schnittstelle überhaupt keine Daten mehr ankommen - also durch meinen Code irgendwas im Handling zwischen DLL und Programm total schief läuft. :/


Mein Import sieht so aus:
C#:
public class Network_Access {
   ...
        public delegate void uebergabefunk(UInt32 hdl, IntPtr data);
        
        [DllImport("iBeanAPI.dll", EntryPoint = "RegisterEvent")]
        // return value:    
        //      0 if successful, else <0
        // parameter values:
        //  (1) Handle of Com-Port
        //  (2) "pointer" to the specific function
        public extern static UInt32 RegisterEvent(UInt32 handle, IntPtr data);
   ...
}

und so implementiere ich das Ganze (handle ist der Rückgabeparameter der open-Funktion und beschreibt das handle des Com-Ports)

C#:
   ...
     public partial class Form1 : Form
    {
        public Network_Access.uebergabefunk Uebergabe = new Network_Access.uebergabefunk(Auswertung);

        ...

        private void button1_Click(object sender, EventArgs e)
        {
            ...
            IntPtr test_ptr = Marshal.GetFunctionPointerForDelegate(Uebergabe);
            Network_Access.RegisterEvent(handle, test_ptr);

            GC.KeepAlive(test_ptr);
            ...
        }


        public static void Auswertung(UInt32 events, IntPtr data)
        {
        //selbst ohne Inhalt wird diese Funktion zwar einmal aufgerufen, danach kommt 
        // aber nicht mal mehr beim seriellen Port etwas an  
        
        /*if (this.InvokeRequired)
            {
                this.Invoke(new Network_Access.uebergabefunk(Auswertung), new object[] { events, data });
            }

            else
            {
            ...
            }
        */
        }
        ...
    }
 
Zuletzt bearbeitet von einem Moderator:
D.h. das Event wird nur ein einziges Mal geworfen und dann passiert nichts mehr? Oder wird das Event schon immer geworfen, aber es kommen keine Daten mit?
 
Das Event wird nur einmal geworfen.
Ich habe mittlerweile mittles Portmonitor herausgefunden, dass nach dem ersten Aufruf meiner Funktion auch am seriellen Port nichts mehr passiert - obwohl dort definitiv Daten einlaufen.
 

Neue Beiträge

Zurück