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:
und so implementiere ich das Ganze (handle ist der Rückgabeparameter der open-Funktion und beschreibt das handle des Com-Ports)
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: