Benutzer mit den meisten Antworten
PInvokeStackImbalance - Fehlermeldung bei .dll-Aufruf

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 SubPrivate Sub AlleDigitAus_Click()
ClearAllDigital()
End SubPrivate 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 SubPrivate Sub KarteSuchenButton_Click()
Connect_Click()
End SubPrivate 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
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- Als Antwort markiert Robert BreitenhoferModerator Montag, 21. März 2011 09:31
-
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
- Als Antwort markiert Robert BreitenhoferModerator Montag, 21. März 2011 09:25
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- Als Antwort markiert Robert BreitenhoferModerator Montag, 21. März 2011 09:31
-
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
- Als Antwort markiert Robert BreitenhoferModerator Montag, 21. März 2011 09:25
-
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:
Kann ich meine VB6 Anwendungen nach VB.NET übernehmen?
Grüße,
Robert