none
PInvokeStackImbalance - Fehlermeldung bei .dll-Aufruf RRS feed

  • Frage

  • Für ein Jugend-Forscht-Projekt meiner Azubis muss ich eine I/O-Karte über USB anbinden.
    Die zur Karte gehörende K8055d.dll befindet sich in System32.

    Eine erste Programmversion in Excel-VBA funktionierte.
    Da VBA jedoch keine Timer besitzt habe ich mir Visual Basic 2010 Express heruntergeladen und installiert.
    Nach der notwendigen Anpassung der Eigenschaftsnamen (z.B. VBA .value = Express .text u.ä.) wurde das Programm ohne Beanstandung kompiliert.
    Wenn ich jedoch den Kanal zur Karte öffnen will (Sub Connect_Click()) bekomme ich an der Programmzeile, die ich im nachfolgenden Quelltext durch die Punktlinien gekennzeichnet habe, folgende Rückmeldung:

    PInvokeStackImbalance wurde erkannt
    Ein Aufruf an die PInvoke-Fuktion "Handlaufüberwachung-V1!
    WindowsApplication1.Form1::OpenDevice" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonventionen und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.

    Was bedeutet diese Fehlermeldung, und was kann ich dagegen tun. Im Netz habe ich dazu nichts gefunden.


    Erklärung der Funktion:
    Es können bis zu 4 Karten gleichzeitig angeschlossen werden. Adressvergabe über Jumper Adr.0-3.
    Die OpenDevice-Funktion öffent die übergebene Adresse und meldet bei Erfolg die Adresse zurück.

    Relevanter Ausschnitt aus Quellcode:


    Public Class Form1

        'Option Explicit
        Private Declare Function OpenDevice Lib "K8055d.dll" (ByVal CardAddress As Long) As Long
        Private Declare Sub CloseDevice Lib "K8055d.dll" ()
        Private Declare Function ReadAnalogChannel Lib "K8055d.dll" (ByVal Channel As Long) As Long
        Private Declare Sub ReadAllAnalog Lib "K8055d.dll" (ByVal Data1 As Long, ByVal Data2 As Long)
        Private Declare Sub OutputAnalogChannel Lib "K8055d.dll" (ByVal Channel As Long, ByVal Data As Long)
        Private Declare Sub OutputAllAnalog Lib "K8055d.dll" (ByVal Data1 As Long, ByVal Data2 As Long)
        Private Declare Sub ClearAnalogChannel Lib "K8055d.dll" (ByVal Channel As Long)
        Private Declare Sub SetAllAnalog Lib "K8055d.dll" ()
        Private Declare Sub ClearAllAnalog Lib "K8055d.dll" ()
        Private Declare Sub SetAnalogChannel Lib "K8055d.dll" (ByVal Channel As Long)
        Private Declare Sub WriteAllDigital Lib "K8055d.dll" (ByVal Data As Long)
        Private Declare Sub ClearDigitalChannel Lib "K8055d.dll" (ByVal Channel As Long)
        Private Declare Sub ClearAllDigital Lib "K8055d.dll" ()
        Private Declare Sub SetDigitalChannel Lib "K8055d.dll" (ByVal Channel As Long)
        Private Declare Sub SetAllDigital Lib "K8055d.dll" ()
        Private Declare Function ReadCounter Lib "K8055d.dll" (ByVal Channel As Long) As Boolean
        Private Declare Function ReadAllDigital Lib "K8055d.dll" () As Long
        Dim AllDigital As Integer
        Dim Warten As Integer
        Dim Langsam As Integer
        Dim Durchlauf As Integer
        Dim CardAddress As Long
        Dim Rückmeldung As Long
        Private Declare Sub ResetCounter Lib "K8055d.dll" (ByVal CounterNr As Long, ByVal DebounceTime As Long)

     

        Private Sub CommandButton1_Click()
            SetDigitalChannel(3)
        End Sub

        Private Sub AlleDigitAus_Click()
            ClearAllDigital()
        End Sub

        Private Sub DigitEingButton_Click()
            DigitalEingängeEinlesen()
        End Sub
        Private Sub DigitalEingängeEinlesen()
            DigitalEinAlle.Text = ReadAllDigital()
            I1Digital.Checked = False
            I2Digital.Checked = False
            I3Digital.Checked = False
            I4Digital.Checked = False
            I5Digital.Checked = False
            AllDigital = Int(ReadAllDigital())
            I1Digital.Checked = AllDigital And 1
            I2Digital.Checked = AllDigital And 2
            I3Digital.Checked = AllDigital And 4
            I4Digital.Checked = AllDigital And 8
            I5Digital.Checked = AllDigital And 16
        End Sub

        Private Sub KarteSuchenButton_Click()
            Connect_Click()
        End Sub

        Private Sub Connect_Click()
           
            CardAddress = 0
            'CardAddress = 3 - (CheckBox1.Checked + CheckBox2.Checked * 2)
            If CheckBox1.Checked = False Then CardAddress = CardAddress + 1
            If CheckBox2.Checked = False Then CardAddress = CardAddress + 2

    ..............................................................................
            Rückmeldung = OpenDevice(CardAddress)
    ..............................................................................

            Select Case Rückmeldung
                Case 0, 1, 2, 3
                    Label1.Text = "Karte " + Str(CardAddress) + " verbunden"
                Case -1
                    Label1.Text = "Karte " + Str(CardAddress) + " nicht gefunden"
            End Select
        End Sub


        Private Sub Form_terminate()
            CloseDevice()
        End Sub

     


        Private Sub KarteTrennButton_Click()
            Label1.Text = "Karte getrennt"
            CloseDevice()
        End Sub

     
        Private Sub KarteSuchenButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KarteSuchenButton.Click
            Connect_Click()
        End Sub
    End Class

    Freitag, 25. Februar 2011 08:26

Antworten

  • Hallo Ralf,

    Eine erste Programmversion in Excel-VBA funktionierte.
    [...]

    PInvokeStackImbalance wurde erkannt
    Ein Aufruf an die PInvoke-Fuktion "Handlaufüberwachung-V1!
    WindowsApplication1.Form1::OpenDevice" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonventionen und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.

    Was bedeutet diese Fehlermeldung, und was kann ich dagegen tun.
    [...]
        Private Declare Function OpenDevice Lib "K8055d.dll" (ByVal CardAddress As Long) As Long   


    Auf die Schnelle: Der Datentyp Long in VBA ist ungleich dem Datentyp Long in .NET (4 Byte/32 Bit zu 8 Byte/64 Bit). Verwende in .NET statt dessen Integer. Eventuell hält der Hersteller dieser DLL auch angepasste Deklarationen für diese DLL für .NET bereit.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Freitag, 25. Februar 2011 08:33
    Moderator
  • Hallo Thorsten,

    vielen Dank für den Tip!

    Die Fehlermeldung ist weg, und irgendwelche Werte werden übertragen. Zwar noch nicht die Werte, die eigentlich kommen sollten, aber ich bin auf dem richtigen Weg!

     

    Gibt es eigentlich ein Konvertierungsprogramm, dass VB-Code in VB.Net-Code konvertiert? Ich habe festgestellt dass auch die Subs, die z.B. durch Klick-Ereignisse aufgerufen werden andere Namen haben.

     

    Gruß Ralf

    Freitag, 25. Februar 2011 09:23

Alle Antworten

  • Hallo Ralf,

    Eine erste Programmversion in Excel-VBA funktionierte.
    [...]

    PInvokeStackImbalance wurde erkannt
    Ein Aufruf an die PInvoke-Fuktion "Handlaufüberwachung-V1!
    WindowsApplication1.Form1::OpenDevice" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonventionen und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.

    Was bedeutet diese Fehlermeldung, und was kann ich dagegen tun.
    [...]
        Private Declare Function OpenDevice Lib "K8055d.dll" (ByVal CardAddress As Long) As Long   


    Auf die Schnelle: Der Datentyp Long in VBA ist ungleich dem Datentyp Long in .NET (4 Byte/32 Bit zu 8 Byte/64 Bit). Verwende in .NET statt dessen Integer. Eventuell hält der Hersteller dieser DLL auch angepasste Deklarationen für diese DLL für .NET bereit.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Freitag, 25. Februar 2011 08:33
    Moderator
  • Hallo Thorsten,

    vielen Dank für den Tip!

    Die Fehlermeldung ist weg, und irgendwelche Werte werden übertragen. Zwar noch nicht die Werte, die eigentlich kommen sollten, aber ich bin auf dem richtigen Weg!

     

    Gibt es eigentlich ein Konvertierungsprogramm, dass VB-Code in VB.Net-Code konvertiert? Ich habe festgestellt dass auch die Subs, die z.B. durch Klick-Ereignisse aufgerufen werden andere Namen haben.

     

    Gruß Ralf

    Freitag, 25. Februar 2011 09:23
  • Hallo Ralf Schmid, 

    Gibt es eigentlich ein Konvertierungsprogramm, dass VB-Code in VB.Net-Code konvertiert? Ich habe festgestellt dass auch die Subs, die z.B. durch Klick-Ereignisse aufgerufen werden andere Namen haben.

    Dank Thorsten Dörfler hast Du hier auch eine Antwort:

    http://social.msdn.microsoft.com/Forums/de-DE/visualcsharpde/thread/ded31c79-fe14-4b55-bc4c-9591495f1e12#a74bd942-610d-4ea6-80f8-aff0f691e388

    Kann ich meine VB6 Anwendungen nach VB.NET übernehmen?

    Grüße,

    Robert

    Montag, 21. März 2011 09:30
    Moderator