INI Wert lesen

Einen Wert aus einer INI-Datei lesen

Genauso „einfach“ ist es, einen Wert aus einer INI-Datei zu lesen. Die Funktion GetPrivateProfileString besitzt 6 Argumente:

GetPrivateProfileString
Argument Bedeutung Beispielwerte
lpApplicationName Name der Sektion bzw. des Abschnitts Section 01
lpKeyName Name des Schlüssels Key 01
lpDefault zu schreibender Wert i.d.R. Leerstring
lpReturnedString Dimensionierte Rückgabestring dimensionierter String
nSize Länge von lpReturnedString Länge des dimensionierter Strings
lpFileName Gültiger Pfad zur INI-Datei C:\WINNT\Dummy.ini

Wie wir bereits in der Funktion GetWindowsDirectory kennen gelernt haben, müssen wir auch hier für die Rückgabe des gewünschten Wertes, einen String entsprechend dimensionieren. Für die notwendige Länge gibt’s hier jedoch keine „Eselsbrücke“ (beim Ermitteln des Windows-Verzeichnisses wurde der String mit 260 Zeichen gefüllt, da ein Dateipfad maximal 255 Zeichen lang sein darf). Man sollte also einen „genügend“ langen Rückgabestring dimensionieren.

Wie (fast) alle API-Funktionen gibt auch GetPrivateProfileString einen Wert zurück; leider gestaltet sich die Auswertung dieses Ergebnisses etwas umständlich:

Rückgabewerte
Rückgabe Bedeutung
nSize - 1 Wenn weder lpAppName noch lpKeyName den Wert NULL besitzen und der Rückgabestring zu klein bemessen war, wird der String abgeschnitten und ein Chr(0) Zeichen angehängt.
nSize - 2 Wenn entweder lpAppName oder lpKeyName den Wert NULL besitzen und der Rückgabestring zu klein bemessen war, wird der String abgeschnitten und zwei Chr(0) Zeichen angehängt.

Wir sollten also möglichst vermeiden, einen zu kurzen Rückgabestring zu dimensionieren. Auf dem sicheren Wege sind wir, wenn der Rückgabestring in der Länge der Datei dimensioniert wird, außer wir sind uns über die notwendige Länge im Klaren. Die Dateilänge zu nutzen „kostet“ zwar kurzfristig ein bisschen Speicher, aber der zurückgegebene Wert kann niemals länger als die Datei selbst sein.

Die nachfolgende „Wrapper“-Funktion ist schon sehr sicher, verzichtet aber auf die Längenprüfung nSize – 1 bzw. nSize – 2; wer das möchte, kann die Funktion gerne entsprechend erweitern. Wir gehen also davon aus, dass ein Rückgabewert der API-Funktion > 0 uns es direkt erlaubt, die entsprechende Anzahl Zeichen aus dem Rückgabestring zu extrahieren.

Die „Wrapper“-Funktion stellt sich folgt dar:

Beispiel:

Public Function GetMySetting(ByVal sIniFilePath As String, _
                             ByVal sSection As String, _
                             ByVal sKey As String, _
                             ByRef sResult As String, _
                             ByRef sError As String) As Boolean
 
    Dim lResult As Long     'API-Rückgabewert
    Dim lLength As Long     'Dateilänge der INI-Datei
    Dim sBuffer As String   'String für den Rückgabewert
 
   'Rückgabestring initialisieren
    sResult = vbNullString
   'Fehlerhandling einschalten, falls es die Datei nicht gibt
    On Error Resume Next
   'Dateilänge ermitteln
    lLength = FileLen(sIniFilePath)
   'Länge (und Fehler) auswerten
    If lLength = 0 Or Err.Number <> 0 Then Exit Function
   'Fehlerhandling wieder ausschalten
    On Error GoTo 0
   'Rückgabestring dimensionieren
    sBuffer = Space(lLength)
   'API-Funktion ausführen
    lResult = GetPrivateProfileString(sSection, sKey, vbNullString, _
                                      sBuffer, Len(sBuffer), sIniFilePath)
   'Resultat auswerten
    If lResult > 0 Then
       'Rückgabewert "extrahieren"
        sResult = Left$(sBuffer, lResult)
       'Funktionsrückgabewert setzen
        GetMySetting = True
    ElseIf Err.LastDllError <> 0 Then
       'API-Fehlerbeschreibung ermitteln und zurückgeben
        sError = GetDllErrorDescription(Err.LastDllError)
       'Funktionsrückgabewert setzen
        GetMySetting = False
    End If
 
End Function

Und hier ein „Zugriffsbeispiel:“

Beispiel:

' Wrapper-Funktion
Sub INI_Sample0()
 
    Dim sINIPath    As String
    Dim sResult     As String
    Dim sError      As String
   'Pfad zum Windows-Ordner ermitteln
    sINIPath = API_GetWindowsDir()
   'Backslash prüfen und ggf. hinzufügen
    If Right$(sINIPath, 1) <> "\" Then sINIPath = sINIPath & "\"
   'Unseren INI-Dateinamen anfügen
    sINIPath = sINIPath & "Dummy.ini"
   'Jetzt können wir die Wrapper-Funktion aufrufen
    If GetMySetting(sINIPath, "Section 01", "Key 01", sResult, sError) Then
          MsgBox sResult
    Else: MsgBox sError
    End If
 
End Sub