Accessviolationexception

Hallo

Wer kann mir weiter helfen? Ich tue mich etwas schwer mit dem accessviolationexception Fehler beim Schreiben in eine Ini datei. Wie kann man den Fehler reproduzieren? Ganz einfach: Man Nehme VB 2005 oder VB 2008 und greiffe mehrmals auf die Ini Zu zum Lesen. Dann greife man einmal auf die Ini zum Schreiben, und schon hat man den Salat. Es kommt ein Fehler. Wie zum Geier kann man diesen Ausschalten oder umschiffen?

Besten Dank für jeden Hinweis

Grüsse Sebastian

Module modFunctionen
Dim instance As AccessViolationException

'Funktion Ini Lesen
_
Private Function GetPrivateProfileStringA(ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As System.Text.StringBuilder, _
ByVal nSize As Short, _
ByVal lpFileName As String) As Long

End Function

'Funktion Ini Schreiben
_
Private Function WritePrivateProfileStringA(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As String
End Function

'Ini stückweise einlesen
Private Function GetINIString(ByVal Dateiname As String, ByVal DieSektion As String, ByVal DerEintrag As String) As String
Dim strItem As New System.Text.StringBuilder(256) 'New System.Text.StringBuilder(256)
GetPrivateProfileStringA(DieSektion, DerEintrag, „“, strItem, strItem.Capacity, Dateiname)
Return strItem.ToString
End Function

Public Function IniSchreiben(ByVal Dateiname As String, ByVal Sektion As String, ByVal Eintrag As String, ByVal Wert As String) 'IniDatei Schreiben
Dim s = WritePrivateProfileStringA(Sektion, Eintrag, Wert, Dateiname)
Return s
End Function

Public Function IniLesen(ByVal Dateiname As String, ByVal Sektion As String, ByVal Eintrag As String) 'Ini Datei Lesen
Dim s = GetINIString(Dateiname, Sektion, Eintrag)
IniLesen = s
End Function

Public Function IniEintragLöschen(ByVal Dateiname As String, ByVal Sektion As String, ByVal Eintrag As String) 'Ini Datei Eintrag löschen
Dim x = WritePrivateProfileStringA(Sektion, Eintrag, „“, Dateiname)
IniEintragLöschen = x
End Function

Public Function IniSektionLöschen(ByVal Dateiname As String, ByVal Sektion As String) 'Ini Datei Sektion löschen
Dim x = WritePrivateProfileStringA(Sektion, 0, 0, Dateiname)
IniSektionLöschen = x
End Function
End Module

Hallo!

Ich hab’s jetzt zwar nicht ausprobiert, aber Du hast Dich auf jeden Fall in der P/Invoke-Deklaration von GetPrivateProfileString verhaut:

ByVal nSize As Short, _

passt nicht, nSize ist im Original als uint deklariert, also 32bit, nicht 16 wie in Deiner Deklaration.
Damit machst Du Dir den Stack beim Aufruf kaputt.
Ersetze mal Short durch Integer und probier’s nochmal.

Gruß,
Martin

accessviolationexception
Besten dank für den Hinweis Martin, habs ausprobiert und es funktioniert nicht, weil anscheinend unter VS 2008 Integer neu short ist. Der Fehler tritt in der folgenden Codesegment ein:


Public Function IniSchreiben(ByVal Dateiname As String, ByVal Sektion As String, ByVal Eintrag As String, ByVal Wert As String)
Dim s = WritePrivateProfileStringA(Sektion, Eintrag, Wert, Dateiname)
Return s
end function

und zwar bei der Zeile:
Dim s = WritePrivateProfileStringA(Sektion, Eintrag, Wert, Dateiname)
Ich habe den Eindruck, dass ich irgendwie den Fehler abfangen muss mit einer IF bedingung. Das ganze liegt übrigens am .Net Framework 3.5 (oder grösser 2).

Besten Dank für jedere weitere Hilfe

Grüsse Sebastian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Hallo nochmal!

Besten dank für den Hinweis Martin, habs ausprobiert und es
funktioniert nicht, weil anscheinend unter VS 2008 Integer neu
short ist. […]

*seufz*
Garantiert nicht! Was meinst Du, was passieren würde, wenn MS einfach bestimmen würde, dass Integer nur noch 16bit lang ist? Dann läuft so gut wie keine Anwendung mehr wie früher! Diese Behauptung ist leider hochgradiger Quatsch!

Ich habe den Eindruck, dass ich irgendwie den Fehler abfangen
muss mit einer IF bedingung. Das ganze liegt übrigens am .Net
Framework 3.5 (oder grösser 2).

Wie kommst Du darauf? Hast Du’s mit .NET 2.0 ausprobiert und dort läuft es bei Dir? Wohl kaum.

Besten Dank für jedere weitere Hilfe

Ich hab’s jetzt doch mal explizit ausprobiert (mit .NET 2.0) und dabei noch mehr Fehler in Deiner P/Invoke Deklaration gefunden.
Neben der Tatsache, dass nSize bei GetPrivateProfileString Integer sein muss , hast Du außerdem beim Rückgabetyp von WritePrivateProfileString geschlampt. Das Teil gibt bool zurück und nicht string!
Außerdem: Warum verwendest Du explizit die ‚A‘-Varianten der Funktionen, wenn .NET normalerweise Unicode verwendet? Lass’ das ‚A‘ am Ende jeweils weg und korrigier die zwei falschen Typen, dann geht’s.

Gruß,
Martin

Grüsse Sebastian

Besten Dank Martin für deine Tipps, habe jetzt mal alles so gesetzt, wie Du es gesagt hast und es geht immer noch nicht. Es kommt immer noch der Fehler accessviolationexception wurde nicht behandelt. Keine Ahnung was das wieder für einen schmarren ist. Bin allmählich am durchdrehen ab diesem mist.
Besten Dank für jede weitere Hinweise.
Grüsse Sebastian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Sobald Du mit P/Invoke arbeitest, musst Du peinlichst genau (!) darauf achten, dass die aufgerufenen Funktionen auch mit einer passenden Signatur deklariert sind, sonst passiert genau das, was Du gerade erlebst.
Nimm diese Deklarationen, dann funktioniert es:

 'Funktion Ini Lesen
 \_
 Private Shared Function GetPrivateProfileString(ByVal lpAppName As String, \_
 ByVal lpKeyName As String, \_
 ByVal lpDefault As String, \_
 ByVal lpReturnedString As System.Text.StringBuilder, \_
 ByVal nSize As Integer, \_
 ByVal lpFileName As String) As Integer
 End Function

 'Funktion Ini Schreiben
 \_
 Private Shared Function WritePrivateProfileString(ByVal lpApplicationName As String, \_
 ByVal lpKeyName As String, \_
 ByVal lpString As String, \_
 ByVal lpFileName As String) As Boolean
 End Function

Kennst Du eigentlich http://www.pinvoke.net? Das ist ein recht praktisches Wiki mit Deklarationen für eine große Anzahl von Funktionen. Wie bei Wikis üblich, ist es zwar nicht ganz 100% fehlerfrei, aber im Großen und Ganzen sehr hilfreich.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Sorry für das späte schreiben, ich habe es versucht und es hat funktioniert, allerdings fügte ich die Deklaration in eine Public Class ein.
Mit PInvoke, keine Ahnung was das ist.

Gruss Sebastian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

[…]

Sorry für das späte schreiben, ich habe es versucht und es hat
funktioniert, allerdings fügte ich die Deklaration in eine
Public Class ein.
Mit PInvoke, keine Ahnung was das ist.

http://en.wikipedia.org/wiki/P/invoke

Kurz zusammengefasst: Das Aufrufen von z.B. Win32-Funktionen aus verwaltetem Code heraus.

Gruss Sebastian

Gruß,
Martin