Ini Funktion fehlerhaft?

05/11/2008 - 12:36 von Hans Peter Glück | Report spam
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
 

Lesen sie die antworten

#1 Gerald Mahlmeister
05/11/2008 - 16:38 | Warnen spam
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" schrieb im Newsbeitrag
news:ges0gp$e5n$03$
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

Ähnliche fragen