System.AccessViolationException

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von DTF.

    System.AccessViolationException

    Hey Community :)

    ich hab ein kleines und doch riesengrosses Problem:

    Ich versuche eine Funktion der bass.dll aufzurufen und bekomm eine System.AccessViolationException - 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.

    Hier der Code:

    VB.NET-Quellcode

    1. If BassVst.BASS_VST_GetInfo(VSTInstrumentChannel, vstInfo) AndAlso vstInfo.hasEditor Then


    Und wenn ich das so mache:

    VB.NET-Quellcode

    1. If BassVst.BASS_VST_GetInfo(VSTInstrumentChannel, vstInfo) Then
    2. If vstInfo.hasEditor Then...


    Dann beendet das Programm einfach ohne eine Fehlermeldung...


    Weiss jemand wie man da dran gehen kann?
    @kafffee Leider kann ich das nicht nachvollziehen, dazu müsstest Du den kompletten relevanten Code posten.
    Was steht denn in der Befehlsbeschreibung von BASS_VST_GetInfo() zum zweiten Parameter?
    ====
    Wenn es mit dem Zweizeiler funktioniert, mach es so.
    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!
    @RodFromGermany

    Ne mit dem Zweizeiler gehts erst recht nicht. Da beendet das Programm einfach so ohne Fehlermeldung. Das hatte ich noch nie...

    Was könnte denn alles relevant sein? Die komplette Funktion ist so:


    VB.NET-Quellcode

    1. Private Sub OeffneInstrumentenRack_Execute(obj As Object)
    2. Dim OKVM = New OKDialogViewModel
    3. Dim vstInfo As New BASS_VST_INFO()
    4. Dim success As Boolean = BassVst.BASS_VST_GetInfo(VSTInstrumentChannel, vstInfo)
    5. If success AndAlso vstInfo.hasEditor Then
    6. LeeresVM = New ViewModel.LeeresViewModel("Instrument " & CStr(WelcheInstanz + 1) & ": " & vstInfo.effectName, VSTInstrumentChannel, Nothing, Me) 'HIER LETZTES ARGUEMnT
    7. FensterHandle = FensterService.OeffnePlugInFenster("Instrument " & CStr(WelcheInstanz + 1) & ": " & vstInfo.effectName, vstInfo.editorHeight + 28, vstInfo.editorWidth, LeeresVM, Me)
    8. LeeresVM.UIHandles = FensterHandle
    9. Debug.WriteLine("effektname" & vstInfo.effectName)
    10. 'MessageBox.Show("stream handle: " & CStr(AngewendeteEffekte(index).Handle))
    11. If UIOffen Then
    12. OKVM = New OKDialogViewModel
    13. OKVM.Meldung = "Das User-Interface dieses Plugins ist bereits geöffnet."
    14. dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
    15. Else
    16. BassVst.BASS_VST_EmbedEditor(VSTInstrumentChannel, FensterHandle(0))
    17. UIOffen = True
    18. MainModule.InstrumentenListe(InstrumentPlugInIndex).UIOffen = True
    19. End If
    20. Else
    21. OKVM = New OKDialogViewModel
    22. OKVM.Meldung = "Dieses Plugin besitzt kein User-Interface."
    23. dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
    24. End If
    25. End Sub


    wird per WPF Command aufgerufen aber das tut glaube ich nichts zur Sache??

    Die Docs für die Funktion findest du hier (unter Syntax findest du die Info zum zweiten Parameter):

    bass.radio42.com/help/html/f76…409-e479-5d3b7d268397.htm
    @kafffee
    Ist VSTInstrumentChannel wirklich ein VST-Handle oder doch ein StreamHandle?
    Probier mal mit out Attribute oder byref für vstInfo.

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Sollte passen mit dem Handle:

    VSTInstrumentChannel = BassVst.BASS_VST_ChannelCreate(44100, 2, MainModule.InstrumentenListe(value).Pfad, BASSFlag.BASS_STREAM_DECODE Or BASSFlag.BASS_SAMPLE_FLOAT)

    Normalerweise passiert bei der bass.dll aber kein Absturz, Fehler werden "ignoriert" und man kann sie mit einer Methode auslesen....

    Wie stellst du dir das vor mit ByRef und Out Attribute? Wie wäre die Syntax? ByRef kenn ich aber ich hab ja selber glaube ich keinen Einfluss auf diese Option, denn die Funktion. hab nicht ich geschrieben sondern gehört zur bass.dll...

    Und Out Attribute noch nie gehört von...

    kafffee schrieb:

    Ne mit dem Zweizeiler gehts erst recht nicht.
    Sorry, fehl gelesen.
    Die Bass-Seite
    bass.radio42.com/help/html/f76…09-e479-5d3b7d268397.htm#
    bietet diese VB-Deklaration. Hast Du die so:

    VB.NET-Quellcode

    1. <DllImportAttribute("bass_vst">]
    2. Public Shared Function BASS_VST_GetInfo(vstHandle As Integer, <OutAttribute> ret As BASS_VST_INFO) As Boolean
    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!
    @kafffee Wie sieht die Deklaration der Prozedur BASS_VST_GetInfo() in Deinem Projekt aus?
    Drauf klicken, F12.
    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!
    @RodFromGermany

    VB.NET-Quellcode

    1. [DllImport("bass_vst")]
    2. [return: MarshalAs(UnmanagedType.Bool)]
    3. public static extern bool BASS_VST_GetInfo(int vstHandle, [In][Out] BASS_VST_INFO ret);
    4. public static BASS_VST_INFO BASS_VST_GetInfo(int vstHandle)
    5. {
    6. BASS_VST_INFO bASS_VST_INFO = new BASS_VST_INFO();
    7. if (BASS_VST_GetInfo(vstHandle, bASS_VST_INFO))
    8. {
    9. return bASS_VST_INFO;
    10. }
    11. return null;
    12. }
    @kafffee Muss bei dem bASS_VST_INFO nicht zufällig das Mamber channelHandle gesetzt werden?
    Wenn der zugewiesene Kanal (bei Dir 0) nicht erlaubt ist, könnte so was passieren.
    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!
    @RodFromGermany

    Wo und in welcher Zeile meinst Du? Und wie kommst Du drauf dass das bei mir 0 ist?

    Hab das grad mal noch mit ein paar anderen Vst-DLLs probiert. Also dessen Info ja geholt werden soll. Bei einem weiteren hat es funktioniert wie es soll, bei noch einem weiteren hångt sich das UI meines Programms auf und es ist unmöglich, die Zeile rauszufinden bzw. Da wo ich denke dass es hängt hat überhaupt nichts mit der Sache zu tun...

    Hab das auch mal im Forum von Un4seen Bass gepostet, mal gucken was da dabei rauskommt...

    kafffee schrieb:

    Wo und in welcher Zeile meinst Du?
    Die betreffende Zeile ist bei Dir noch nicht vorhanden.
    .NET initialisiert alle Variablen mit 0 bzw. Nothing.

    VB.NET-Quellcode

    1. BASS_VST_INFO bASS_VST_INFO = new BASS_VST_INFO();
    2. bASS_VST_INFO.channelHandle = 42 ' oder was auch immer
    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!

    kafffee schrieb:

    Und Out Attribute noch nie gehört von...


    Out ist ähnlich wie ref(ByRef), gibt aber den Unterschied das mit out die übergebene Variable nicht initiaslisiert sein muss. mit ref muss sie vorher initialisiert sein. In VB schaut das wieder komsich aus, aber aus VB bin ich rausgewachsen, musste das selbst übersetzen lassen zu VB.

    VB.NET-Quellcode

    1. Imports System.Diagnostics
    2. Imports System.Runtime.InteropServices
    3. Namespace WinFormsApp1
    4. Public Partial Class Form1
    5. Inherits Form
    6. Public Structure Example
    7. Public a As Integer
    8. Public b As Integer
    9. End Structure
    10. Private Sub GetIt(<Out> ByRef example As Example)
    11. example = New Example With {
    12. .a = 1000,
    13. .b = 2000
    14. }
    15. End Sub
    16. Public Sub New()
    17. InitializeComponent()
    18. End Sub
    19. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
    20. Dim ex As Example
    21. GetIt(ex)
    22. Debug.WriteLine(ex.a.ToString())
    23. End Sub
    24. End Class
    25. End Namespace

    PS @kafffee
    Huch, achne. Hätte die übersetzung lesen sollen, muss nun selbst schauen ob das mit VB überhaupt so geht. Ich meine beim Marshal'n hatte ich da mal was mit in VB
    So schaut das in C# aus:(Ich sollte mich aus VB Themen besser raushalten, habs VB echt verlernt)
    Spoiler anzeigen

    C#-Quellcode

    1. using System.Diagnostics;
    2. using System.Runtime.InteropServices;
    3. namespace WinFormsApp1
    4. {
    5. public partial class Form1 : Form
    6. {
    7. public struct Example
    8. {
    9. public int a;
    10. public int b;
    11. }
    12. private void GetIt(out Example example)
    13. {
    14. example = new Example
    15. {
    16. a = 1000,
    17. b = 2000
    18. };
    19. }
    20. public Form1()
    21. {
    22. InitializeComponent();
    23. }
    24. private void Form1_Load(object sender, EventArgs e)
    25. {
    26. Example ex;
    27. GetIt(out ex);
    28. Debug.WriteLine(ex.a.ToString());
    29. }
    30. }
    31. }

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „DTF“ ()

    kafffee schrieb:

    Aber wie kommst du drauf, dass es diesen Member gibt?
    Google nach bass.dll BASS_VST_INFO und sieh Dir die Member an.
    Eigentlich hatte ich nach .Size gesucht, das kommt bei sehr vielen nativen Strukturen vor, jedoch nicht gefunden. Dafür .channelHandle.
    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!
    Tust du eigendlich richtig debuggen?(Wohl eher nicht, das hättest du sonst gefunden) Wie oft hast du schon Haltepunkte gesetzt? Tip fürs nächste mal: Variablen haben ja Namen, danach kann man mit dem Studio suchen, so findest du die Zeilen für die Haltepunkte, setzte überall welche hin, schau nach welchen Wert die Variable zu dem Zeitpunkt hat, ein Zugriff auf das Ding nach einem Dispose wäre so mit sehr sehr hoher wahrscheinlichkeit aufgefallen. Also -> lerne richtig zu debuggen! So wie du arbeitest, das, solltest du dir noch mal überlegen. Es reicht nicht zu wissen, das man mit einem Hammer einen Nagel einschlagen kann, soll der Nagel richtig reingekloppt werden, muss man wissen wie man drauf haut.(Schräg oder von der Seite sicher nicht). Genau so ist es mit programmieren und der IDE, seine Werkzeuge MUSS man nun mal kennen, wenn man damit anständigt hantieren will.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Nun ja in Sachen Debuggen hab ich schon Fortschritte gemacht wie ich finde. Gab auch schon Zeiten da hab ich hier im Forum drei Themen am Tag aufgemacht...

    Problem bei diesem Thread hier war ganz einfach dass die Fehler, und ich sage bewusst "die" in unterschiedlichen Zeilen aufgetreten sind. Es waren auch mindestens drei oder vier verschiedene Fehler, oder das Programm hat sich einfach ohne Fehler von selbst beendet. Und das alles ohne eine Änderung im Code!
    Und tatsächlich, bei manchen VST DLLs hats geklappt, bei manchen nicht. Jetzt debugge das mal...

    Nicht mal der Ian von Un4seen hat den Fehler direkt gefunden, und der muss es wissen, der hat das Ganze meines Wissens nach programmiert...

    Weiss auch nicht ob "disposed" jetzt das richtige Wort war...

    Wenn du willst poste ich mal den Code, dann kannst du selber entscheiden ob du das entdeckt hättest...

    PS: Bin übrigens grad dabei das mit den Slider und MouseWheels zu probieren danke nochmal für die Demo

    kafffee schrieb:

    Nicht mal der Ian von Un4seen hat den Fehler direkt gefunden, und der muss es wissen, der hat das Ganze meines Wissens nach programmiert...


    Das siehst du falsch, du hast den Fehler in deinem Code, nicht er in seinem! Mit Haltepunkten hätte ich das gefunden. Ich sehe ja in welcher Reihenfolge was passiert, hab ich da ein Handle freigegeben, und nutze das Handle bei einem anderen Haltepunkt danach, ohne das es neu erstellt wurde, dann ist doch sofort klar was los ist, sofern man richtig debuggt. Allein durch die Debug-Ausgabe mit Debug.Writeline hätte ich es gefunden, ob du es glauben magst oder nicht.

    Weiterer Tip, Variablen von irgendwelchen BASS-Handles sind nach dem freigeben nicht automatisch wieder 0, setzt sie immer auf 0 nach der Freigabe, dann kannst du immer vorm verwenden testen, ob 0 oder nicht, dann passiert sowas nicht. Hatte sowas auch schon, aber ich habs bisher immer gefunden.

    Ich weis, debuggen macht keinen Spaß, ist nervig, aber machen muss man es trotzdem lernen. Je mehr man es macht, umso kreativer wird man um seine Fehler zu finden, debuggen zu können ist das A und O. Lies dir irgendwelche Artikel dazu durch, lass dir das mehrfach durch den Kopf gehen, du wirst merken, du findest Fehler schneller, weil du weist wie du sie finden kannst.

    @kafffee
    Bespiel Debug-Ausgabe:(Passt dann auch zur Reihenfolge mit Haltepunkten)
    HANDLE ABC erstellt,
    HANDLE ABC genutzt für,
    HANDLE ABC Freigegeben,
    HANDLE ABC genutzt <-- Da haben wir ihn

    Wenn du das so nun siehst, meinste noch ich hätte den nicht schnell gefunden? Hätte deinen Source nur mit Debug-Ausgabe vollbomben müssen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „DTF“ ()

    DTF schrieb:

    hab ich da ein Handle freigegeben, und nutze das Handle bei einem anderen Haltepunkt danach, ohne das es neu erstellt wurde, dann ist doch sofort klar was los ist


    Jetzt poste ich doch mal den Code, denn ich glaube wir reden aneinander vorbei. Wie du siehst, hatte ich in Zeile 24 und 25 die Handles disposed. Und ich glaube der Fehler lag daran, dass ich dann in Zeile 27 nochmal vstInfo.IsInstrument abfrage, denn als ich die zwei Handles dann in Zeile 47 gemacht hab, gings. Ich hab ja hier nicht explizit nochmal das Handle im Aufruf von vstInfo...

    VB.NET-Quellcode

    1. For Each PlugInDatei In System.IO.Directory.GetFiles(MainModule.VSTVerzeichnis, "*.dll", IO.SearchOption.AllDirectories)
    2. Dim ProduktNameEffekt As String
    3. Dim ProduktNameInstrument As String
    4. Dim vstInfo As New BASS_VST_INFO()
    5. TestHandleInstrument = BassVst.BASS_VST_ChannelCreate(44100, 2, PlugInDatei, 0)
    6. Dim TestHandleEffekt As Integer = BassVst.BASS_VST_ChannelSetDSP(0, PlugInDatei, Nothing, 0)
    7. If (BassVst.BASS_VST_GetInfo(TestHandleEffekt, vstInfo)) AndAlso (Not String.IsNullOrEmpty(vstInfo.effectName)) AndAlso (Not vstInfo.isInstrument) Then
    8. 'ProduktName = vstInfo.productName
    9. ProduktNameEffekt = vstInfo.effectName
    10. Else
    11. ProduktNameEffekt = System.IO.Path.GetFileNameWithoutExtension(PlugInDatei)
    12. End If
    13. If (BassVst.BASS_VST_GetInfo(TestHandleInstrument, vstInfo)) AndAlso (Not String.IsNullOrEmpty(vstInfo.productName)) AndAlso (vstInfo.isInstrument) Then
    14. 'ProduktName = vstInfo.productName
    15. ProduktNameInstrument = vstInfo.effectName
    16. Else
    17. ProduktNameInstrument = System.IO.Path.GetFileNameWithoutExtension(PlugInDatei)
    18. End If
    19. BassVst.BASS_VST_ChannelRemoveDSP(0, TestHandleEffekt)
    20. BassVst.BASS_VST_ChannelFree(TestHandleInstrument)
    21. If vstInfo.isInstrument = False Then
    22. If BassVst.BASS_VST_ChannelSetDSP(0, PlugInDatei, 0, 0) <> 0 Then
    23. EffektListe.Add(New ViewModel.PlugInsViewModel(Nothing, PlugInDatei, ProduktNameEffekt, True, 0, Nothing, False, CType(System.Windows.Application.Current.Resources("VordergrundfarbeBrush"), SolidColorBrush), New List(Of Single)))
    24. Else
    25. BassVst.BASS_VST_ChannelRemoveDSP(0, 0)
    26. SindEffekteInvalid = True
    27. End If
    28. 'EffektListe.Add(New ViewModel.PlugInsViewModel(PlugInDatei, "Effekt1", True, 0, Nothing, False))
    29. 'EffektListe.Add(New ViewModel.PlugInsViewModel(PlugInDatei, "Effekt2", True, 0, Nothing, False))
    30. 'EffektListe.Add(New ViewModel.PlugInsViewModel(PlugInDatei, "Effekt3", True, 0, Nothing, False))
    31. Else
    32. Dim InstrumentTestHandle As Integer = BassVst.BASS_VST_ChannelCreate(44100, 2, PlugInDatei, BASSFlag.BASS_STREAM_DECODE Or BASSFlag.BASS_SAMPLE_FLOAT)
    33. If InstrumentTestHandle <> 0 Then
    34. InstrumentenListe.Add(New ViewModel.PlugInsViewModel(Nothing, PlugInDatei, ProduktNameInstrument, True, 0, Nothing, False, Nothing, New List(Of Single)))
    35. Else
    36. BassVst.BASS_VST_ChannelFree(InstrumentTestHandle)
    37. SindInstrumenteInvalid = True
    38. End If
    39. End If
    40. Next


    DTF schrieb:

    Weiterer Tip, Variablen von irgendwelchen BASS-Handles sind nach dem freigeben nicht automatisch wieder 0, setzt sie immer auf 0 nach der Freigabe, dann kannst du immer vorm verwenden testen, ob 0 oder nicht, dann passiert sowas nicht.

    Jou ist mir klar, so doof bin ich dann doch nicht...

    DTF schrieb:

    Je mehr man es macht, umso kreativer wird man um seine Fehler zu finden,

    Die Erfahrung hab ich auch schon gemacht, hab schon so manches debugged, wo ich nicht mal zu träumen gewagt hätte, dass ich das ohne Hilfe schaff... ;)

    PS: Ich will mich nicht mit dir streiten, ich will nur ein bissel auch meinen Standpunkt mitteilen.