Ein Ausnahmefehler des Typs "System.AccessViolationException" ist aufgetreten.

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Ein Ausnahmefehler des Typs "System.AccessViolationException" ist aufgetreten.

    Hallo alle miteinander,

    ich bin neu im Bereich des Programmierens und arbeite momentan an einer Umprogramierung an einem USB-Gerät. Ziel ist, es dass dem Gerät über das ausführen eine Exe eine Zeichenfolge zugesendet wird, welches dieses in akustische Signale verwandelt. Hierfür hatte ich bereits den funktionierenden VBA-Code:


    Private Declare Function TSLF_Open Lib "TS_LF_SDK.DLL" (ByRef Name As Byte, ByVal Baudrate As Long, ByVal ParityMode As Long, ByVal Timeout As Long) As Long
    Private Declare Function TSLF_Close Lib "TS_LF_SDK.DLL" (ByVal PortHandle As Long) As Long
    Private Declare Function TSLF_RawWrite Lib "TS_LF_SDK.DLL" (ByVal PortHandle As Long, ByRef Buffer As Byte, ByVal BufLen As Long) As Long

    Private Sub Bestätigen1()
    MaxLen = 255
    ListLen = 0
    Err = 0

    Dim NamenListe(255) As Byte
    Dim Buffer(100) As Byte
    'Bestimmung des USB Gerätenamens, wenn sie diesen bereits kennen, können sie den auch fest einstellen
    ListLen = TSLF_GetUSBDeviceNames(NamenListe(0), MaxLen)
    If (ListLen > 1) Then
    'Gerät öffnen
    Handle = TSLF_Open(NamenListe(0), 19200, 0, 500)
    'RawWrite mit 1 Byte mit Wert 7 ergibt einen Buzzer Ton
    Buffer(0) = 7

    Err = TSLF_RawWrite(Handle, Buffer(0), 1)
    'Und wieder schließen, damit die Tastatureingabe wieder aktiv wird.
    TSLF_Close (Handle)
    End If
    End Sub

    Wenn ich jetzt den Code probiere nach VB zu übersetzen um eine lauffähige .exe zu erhalten bekomme ich in der Zeile Resultat = ... den Fehler AccessViolationException mit der Info: Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

    Der Code sieht wie folgt aus:

    Module Module1
    Private Declare Function TSLF_GetUSBDeviceNames Lib "TS_LF_SDK.DLL" (ByRef Buffer As Byte, ByVal nBufferSize As Long) As Long
    Private Declare Function TSLF_Open Lib "TS_LF_SDK.DLL" (ByRef Name As Byte, ByVal Baudrate As Long, ByVal ParityMode As Long, ByVal Timeout As Long) As Long
    Private Declare Function TSLF_Close Lib "TS_LF_SDK.DLL" (ByVal PortHandle As Long) As Long
    Public Declare Function TSLF_RawWrite Lib "TS_LF_SDK.DLL" (ByVal PortHandle As Long, ByRef Buffer As Byte, ByVal BufLen As Long) As Long
    'Funktion für die Buzzer Ausgabe: (Hier als Click auf eine Button, wie sie das machen liegt an ihnen)
    Sub Main()
    Dim MaxLen = 255
    Dim ListLen As Integer
    Dim NamenListe(255) As Byte
    Dim Buffer(100) As Byte
    Dim Resultat As Long
    Dim Handle As Long
    Dim len As Long
    'Bestimmung des USB Gerätenamens, wenn sie diesen bereits kennen, können sie den auch fest einstellen
    ListLen = TSLF_GetUSBDeviceNames(NamenListe(0), MaxLen)
    If (ListLen > 1) Then
    'Gerät öffnen
    Handle = TSLF_Open(NamenListe(0), 19200, 0, 500)
    'RawWrite mit 1 Byte mit Wert 7 ergibt einen Buzzer Ton
    Buffer(0) = 7
    len = 1
    Resultat = TSLF_RawWrite(Handle, Buffer(0), len)
    'Und wieder schließen, damit die Tastatureingabe wieder aktiv wird.
    TSLF_Close(Handle)
    End If
    End Sub
    End Module

    Kann mir da jemand helfen? Die DLL-Dateien habe ich als Dateihänge hinzugefügt.
    Dateien
    @alexc Willkommen im Forum. :thumbup:
    VB6 passt nicht mit System.AccessViolationException zusammen.
    Deswegen beantworte zunächst die Frage
    Mit welcher Sprache programmiere ich eigentlich?
    Wenn Du mit VB.NET arbeiten solltest, sind alle Deine DLL-Deklarationen falsch.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @alexc:
    Ich gehe mal davon aus, dass es zu dieser DLL auch eine Header-Datei gibt - weil sowas normalerweise immer in einer nativen Sprache (C/C++) geschrieben ist. Könntest du diese mit uns teilen?

    Zu deinem Code:
    Alter Code

    VB.NET-Quellcode

    1. Private Declare Function TSLF_Open Lib "TS_LF_SDK.DLL" (
    2. ByRef Name As Byte,
    3. ByVal Baudrate As Long,
    4. ByVal ParityMode As Long,
    5. ByVal Timeout As Long
    6. ) As Long
    7. Private Declare Function TSLF_Close Lib "TS_LF_SDK.DLL" (
    8. ByVal PortHandle As Long
    9. ) As Long
    10. Private Declare Function TSLF_RawWrite Lib "TS_LF_SDK.DLL" (
    11. ByVal PortHandle As Long,
    12. ByRef Buffer As Byte,
    13. ByVal BufLen As Long
    14. ) As Long
    15. Private Sub Bestätigen1()
    16. MaxLen = 255
    17. ListLen = 0
    18. Err = 0
    19. Dim NamenListe(255) As Byte
    20. Dim Buffer(100) As Byte
    21. 'Bestimmung des USB Gerätenamens, wenn sie diesen bereits kennen, können sie den auch fest einstellen
    22. ListLen = TSLF_GetUSBDeviceNames(NamenListe(0), MaxLen)
    23. If (ListLen > 1) Then
    24. 'Gerät öffnen
    25. Handle = TSLF_Open(NamenListe(0), 19200, 0, 500)
    26. 'RawWrite mit 1 Byte mit Wert 7 ergibt einen Buzzer Ton
    27. Buffer(0) = 7
    28. Err = TSLF_RawWrite(Handle, Buffer(0), 1)
    29. 'Und wieder schließen, damit die Tastatureingabe wieder aktiv wird.
    30. TSLF_Close (Handle)
    31. End If
    32. End Sub

    Neuer Code

    VB.NET-Quellcode

    1. Module Module1
    2. Private Declare Function TSLF_GetUSBDeviceNames Lib "TS_LF_SDK.DLL" (
    3. ByRef Buffer As Byte,
    4. ByVal nBufferSize As Long
    5. ) As Long
    6. Private Declare Function TSLF_Open Lib "TS_LF_SDK.DLL" (
    7. ByRef Name As Byte,
    8. ByVal Baudrate As Long,
    9. ByVal ParityMode As Long,
    10. ByVal Timeout As Long
    11. ) As Long
    12. Private Declare Function TSLF_Close Lib "TS_LF_SDK.DLL" (
    13. ByVal PortHandle As Long
    14. ) As Long
    15. Public Declare Function TSLF_RawWrite Lib "TS_LF_SDK.DLL" (
    16. ByVal PortHandle As Long,
    17. ByRef Buffer As Byte,
    18. ByVal BufLen As Long
    19. ) As Long
    20. 'Funktion für die Buzzer Ausgabe: (Hier als Click auf eine Button, wie sie das machen liegt an ihnen)
    21. Sub Main()
    22. Dim MaxLen = 255
    23. Dim ListLen As Integer
    24. Dim NamenListe(255) As Byte
    25. Dim Buffer(100) As Byte
    26. Dim Resultat As Long
    27. Dim Handle As Long
    28. Dim len As Long
    29. 'Bestimmung des USB Gerätenamens, wenn sie diesen bereits kennen, können sie den auch fest einstellen
    30. ListLen = TSLF_GetUSBDeviceNames(NamenListe(0), MaxLen)
    31. If (ListLen > 1) Then
    32. 'Gerät öffnen
    33. Handle = TSLF_Open(NamenListe(0), 19200, 0, 500)
    34. 'RawWrite mit 1 Byte mit Wert 7 ergibt einen Buzzer Ton
    35. Buffer(0) = 7
    36. len = 1
    37. Resultat = TSLF_RawWrite(Handle, Buffer(0), len)
    38. 'Und wieder schließen, damit die Tastatureingabe wieder aktiv wird.
    39. TSLF_Close(Handle)
    40. End If
    41. End Sub
    42. End Module
    So wie das hier aussieht, hast du zu 100% die vorgegebenen Einstellungen von Visual Studio verwendet, denn in dem Code wird etwa einer Integer-Variable ein Long-Wert zugewiesen, was rein technisch schon nicht gehen kann, da ein Long zwei mal so groß ist (vom Wertebereich und von den Bits und Bytes - der computerinternen Darstellung), wie ein Integer.

    Probier einfach mal in die allererste Zeile einmal Option Strict On und Option Explicit On zu stellen, beseitige die Fehler(meldungen), dann reden wir weiter

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell