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:
| 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ü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