Autor Beitrag
sTEk
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 10.12.07 12:49 
Hallo!

Als ersten Beitrag hier habe ich gleich eine Frage, die mich bereits seit einiger Zeit beschäftigt.

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:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
      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)

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
     ...
           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
                  {
                  ...
                  }
              */

              }
              ...
          }


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 10.12.2007 um 12:39