Re: Ini Funktion fehlerhaft?
- From: "Gerald Mahlmeister" <gmahlmeister@xxxxxxxx>
- Date: Wed, 5 Nov 2008 16:38:32 +0100
Hallo Hans!
Ich habe den Code mal mit einer INI Datei hier laufen lassen, das hat aber funktioniert. Was ein bissl merkwürdig aussieht, ist, daß der Buffer mit MAX_ENTRY als Array Obergrenze angelegt wird. D.h. das Byte Array umfasst 32769 Elemente, Du sagst der Funktion aber, daß die Buffer Länge 32768 ist. Da dies ein Element zu wenig ist, sollte es aber keine Probleme geben.
Ich hab die Funktion nach MSDN mal selbst definiert und von der hässlichen ArrayList als Rückgabe befreit:
Private Declare Auto Function GetPrivateProfileSectionNames Lib "kernel32" (ByVal lpszReturnBuffer As IntPtr, _
ByVal nSize As Integer, _
ByVal lpFileName As String _
) As Integer
Public Function GetSectionNames(ByVal iniFilename As String) As IEnumerable(Of String)
Const MAX_BUFFER As Integer = 32768
Dim _buffer As IntPtr = IntPtr.Zero
Try
_buffer = Marshal.AllocCoTaskMem(MAX_BUFFER)
Dim _bytes As Integer = GetPrivateProfileSectionNames(_buffer, MAX_BUFFER, iniFilename)
' Return empty enumeration in case of no result
If _bytes = 0 Then
Return New String() {}
End If
Dim _length As Integer = _bytes - 1 ' Ingore last null char
Dim _names As String = Marshal.PtrToStringAuto(_buffer, _length)
' Return array of section names
Return _names.Split(ControlChars.NullChar)
Finally
If _buffer <> IntPtr.Zero Then
Marshal.FreeCoTaskMem(_buffer)
End If
End Try
End Function
Da aber Deine Variante bei mir auch ging, weiß ich net, ob das was bringt. Eventuell solltest Du mal ein INI File posten, was nicht funktioniert.
Gruß
Gerald
"Hans Peter Glück" <hpglueck@xxxxxxxxxx> schrieb im Newsbeitrag news:ges0gp$e5n$03$1@xxxxxxxxxxxxxxxxxxxx
Mahlzeit zusammen,
ich weiß daß es mittlerweile modernere Techniken gibt, aber ich speichere Daten gerne in .ini-Dateien im Programmverzeichnis. Nun habe ich da vor langer Zeit einen Code im Netz gefunden, der auch sehr gut funktioniert. Nur ist mir gerade eine unzulänglichkeit aufgefallen. Die Funktion GetSectionNames liefert alle Sektionen (die mit [ ] ) AUSSER der ersten. Die erste ist stets nicht im resultierenden ArrayList zu finden. Ich war bisher mit der Anwendung des Codes sehr zufrieden, weil ich ihn nicht im Detail verstehe.
Könnt ihr vielleicht mal drüber schauen und mir sagen wo der Fehler ist, bzw. wie er sich beheben läßt? Wär sehr dankbar.
Private Const MAX_ENTRY As Integer = 32768
Private Declare Ansi Function GetPrivateProfileSectionNames Lib "kernel32" Alias "GetPrivateProfileSectionNamesA" _
(ByVal lpszReturnBuffer() As Byte, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
Public Function GetSectionNames(ByVal Filename As String) As ArrayList
Try
Dim buffer(MAX_ENTRY) As Byte
GetPrivateProfileSectionNames(buffer, MAX_ENTRY, Filename)
Dim parts() As String = Encoding.ASCII.GetString(buffer).Trim(ControlChars.NullChar).Split(ControlChars.NullChar)
Return New ArrayList(parts)
Catch
End Try
Return Nothing
End Function
Gruß,
HP
.
- References:
- Ini Funktion fehlerhaft?
- From: Hans Peter Glück
- Ini Funktion fehlerhaft?
- Prev by Date: Re: Angemeldeter Benutzer
- Next by Date: Re: Ini Funktion fehlerhaft?
- Previous by thread: Ini Funktion fehlerhaft?
- Next by thread: Re: Ini Funktion fehlerhaft?
- Index(es):
Relevant Pages
|