INI-Files



  • char *cBuffer = new char[MAX_PATH];
    
    //AUS INI-FILE AUSLESEN
    GetPrivateProfileString("Name der Gruppe", "Name des Strings", "Was er zurückgibt wenn es fehlschlägt",  cBuffer, MAX_PATH, "Pfad zum Inifile");
    
    //IN INI-FILE SCHREIBEN
    WritePrivateProfileString("Name der Gruppe", "Name des Strings", cBuffer, "Pfad zum Inifile");
    

    Ist ganz einfach und nützlich...



  • Ein INI-File ist in einzelne Abschnitte eingeteilt, welche durch namen in eckigen klammern beschriftet sind.
    In diesen abschnitten können nun beliebig viele verschiedene keys gespeichert werden.
    So ein Key ist einfach ein Name für eine Einstellung die nun vom Programm gesetzt oder abgefragt werden kann.
    Ein Key besteht normalerweise aus dem Tag (Keyname) dem "=" und der Keyvalue (Keywert)

    Bsp:

    [Einstellung]
    Bild=1 ; komentare werden durch das Semikolon eingeleitet

    In den Zeilen mit Abschnittsnamen dürfen keine Kommentare stehen !!!

    Zugriff auf INI-Files

    Die meisten INI-Files sind private Profildaten. Dieser Ausdrauck stammt noch aus Win 3.1, um die INI-Files einer Anwendung von der WIN.INI (Dat war die einzige INI-Datei vor Win 3.1 !!) zu unterscheiden.
    Mit

    WritePrivateProfileString
    

    und

    WritePrivateProfileInt
    

    werden Werte in das private INI-File gespeichert.

    Mit

    GetPrivateProfileString
    

    und

    GetPrivateProfileInt
    

    können die Werte wieder ausgelesen werden.

    Mit

    GetPrivateProfileSection
    

    und

    WritePrivateProfileSection
    

    können ganze Abschnitte des INI-Files gelesen bzw. geschrieben werden.

    Mit

    GetPrivateProfileSectionNames
    

    können alle Abschnittsnamen ausgelesen werden.

    Normalerweise befinden sich private Profildaten im Verzeichnis der Anwendung oder im Windows-Verzeichnis.
    Wenn INI-Files aufgerufen werden, iss es empfehlenswert, immer den vollständingen Pfandnamen anzugeben.

    Mit

    GetProfileString
    

    und

    GetProfileInt
    

    werden Werte aus der **WIN.INI[/cpp] ausgelesen.

    Mit

    WriteProfileString
    

    und

    WriteProfileInt
    

    werden Werte in der [b]WIN.INI** gespeichert/geändert.

    Mit

    GetProfileSection
    

    und

    WriteProfileSection
    

    können nun ganze Abschnitte der WIN.INI gespeichert/geändert werden.

    Ab Win2000 können diese privaten Profile anstatt der INI-Datei in der Registry gespeichert werden.
    Diese Art tritt auf, wenn die INI-Datei und der Initialisierungsabschnitt in der Registry im folgenden Key spezifiziert sind:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Aktuelle Version\IniFileMapping
    

    In diesen Fällen reagieren die privaten Profilfunktionen auf die Informationen der Registry, nicht in den INI-Files.

    Die Profilfunktionen von Win32 lokalisieren die INI-Information in folgenden Steps:

    1. In der Registry nach dem Namen des INI-Files im Key

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Akutelle Version\IniFileMapping
    

    suchen.
    2. Nach dem Abschnittsnamen als Value unter dem Key oder einem Subkey des INI-Files suchen
    3. Wenn der Abschnittsname ein bekannter Wert des INI-Files ist, spezifiziert dieser Wert, wo die Keys für den Abschnitt in der Registry zu finden sind.
    4. Ist der Abschnittsname ein Subkey des INI-Files, spezifizieren benannte Werte in diesem Subkey, wo in der Registry die Keys für die Abschnitte zu finden sind.
    Existiert dieser Key nicht als benannter Wert, dann gibt es einen unbenannten Wert der die Standardposition in der Registry angibt, an der der Key abgelegt ist.
    5. Gibt es keinen Subkey für das INI-File, oder keinen Eintrag für den Abschnittsnamen, wird auf das aktuelle INI-File auf der Harddisk zugegriffen.

    Nachdem die Position in der Registry gefunden wurde, gibt es verschiedene Präfixe, die das Verhalten beim abbilden eines INI-Files ändern.
    Diese Präfixe sind Teil des aktuellen Positionsstrings.

    Präfixe:

    ! Erzwinget, dass alle Einträge an die Registry UND an das INI-File auf der Harddisk gehen.
    # Verursacht, dass der Registry-Wert auf den Wert des INI-Files gesetzt wird, wenn ein sich ein neuer User anmeldet.
    @ Verhindert, dass Leseoperationen an das INI-File auf der Harddisk weitergeleitet werden, wenn in der Registry die angeforderten Daten nicht gefunden werden.
    SYS Der Text nach dem Präfix ist relativ zum Registrykey

    HKEY_LOCAL_MACHINE\SOFTWARE
    

    USR Der Text nach dem Präfix is relativ zum Registrykey

    HKEY_CURRENT_USER
    

    **Zugriffsmethoden:[/cpp]

    UINT GetPrivateProfileInt(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, INT dwDefault, LPCTSTR lpszIniFileName);
    

    Beschreibung:
    Gibt einen Zahlenwert zurück, der einem Key im abschnitt es INI-Files zugeordnet ist.

    Rückgabewert:

    UINT
    

    Der Integerwert des Keys, der aus dem angegebenen Abschnitt des INI-Files ermittelt wurde.
    Wird dieser Wert nicht gefunden, wird der Defaultwert zurückgegeben, id dieser kleiner als 0, wird 0 zurückgegeben.

    Parameter:

    LPCTSTR lpszSectionName
    

    Ein Zeiger auf einen String mit dem Abschnittsnamen.

    LPCTSTR lpszKeyName
    

    Ein Zeiger auf einen String mit dem Keynamen.

    INT dwDefault
    

    Defaultwert, der zurückgegebenwird, wenn der angegebene Key nicht gefunden wurde.

    LPCTSTR lpszIniFileName
    

    Dateiname und Pfad des INI-Files

    DWORD GetPrivatProfileString(LPCSTR lpszSectionName, LPCTSTR lpszKeyName,LPCTSTR lpszDefault, LPTSTR lpszReturnBuffer, DWORD dwBuffer, LPCTSTR lpszIniFileName);
    

    Beschreibung:
    Gibt einen String zurück, der einem Key im abschnitt es INI-Files zugeordnet ist.

    Rückgabewert:
    War die Funktion erfolgreich, wird die Anzahl der Zeichen zurückgegeben (ohne Nullterminator).
    Ist der Buffer zu klein ist der Rückgabewert dwBuffer-1.

    Parameter:
    Gleiche Parameter siehe GetPrivateProfileInt.

    LPCTSTR lpszDefault
    

    Zeiger auf einen String mit dem Defaultwert, der zruückgegeben wird, wenn der angeforderte Abschnitt nicht gefunden wurde.

    LPCTSTR lpszReturnBuffer
    

    Buffer für die zurückzugebende Zeichenkette.

    DWORD dwBuffer
    

    Grösse des Zeichenbuffers

    BOOL GetPrivateProfileStruct(LPCTSTR lpszSectionName, LPCTSTR lpszKey, LPVOID lpStruct, UINT uSizeStruct, LPCSTR lpszIniFile);
    

    Beschreibung:
    Ermitellt die Daten, die einem bestimmten Key im vorgegebenen Abschnitt eines INI-Files zugeordnet sind.
    Beim Ermitteln der Daten wird eine Prüfsumme berechnet und mit der Prüfsumme, die von Write ProfileStruct berechnet wurde.

    Rückgabewert:
    Bei Erfolg TRUE, sonst FALSE.

    Parameter:
    Gleiche Parameter siehe GetPrivateProfileInt.

    LPVOID lpStruct
    

    Ein Zeiger auf einen Puffer, der die Daten empfängt, die der Datei, dem Abschnitt und dem Keyname zugeordnet sind.

    UINT uSizeStruct
    

    Die Grösse des Puffers auf den lpStruct zeigt (in Byte)

    UINT GetProfileInt(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, INT Default);
    

    Siehe GetPrivateProfileInt - hat nur von der [b]WIN.INI**

    DWORDGetProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, LPCTSTR lpstrDefault, LPCTSTR lpszReturnBuffer, DWORD dwBuffer);
    

    Siehe GetPrivateProfileString - hat nur von der WIN.INI

    DWORD GetProfileSection(LPCTSTR lpszSectionName,LPTSTR lpReturnBuffer, DWORD dwBuffer);
    

    Beschreibung:
    Füllt einen Buffer mit Schlüsselzuweisungen eine bestimmten Abschnitts der WIN.INI.

    Rückgabewert:

    DWORD
    

    Anzahl der in den Puffer kopierten Zeichen.

    Parameter:
    Gleiche Parameter siehe GetPrivateProfileInt.

    LPTSTR lpReturnBuffer
    

    Zeiger auf den Puffer

    DWORD dwBuffer
    

    Grösse des Puffers

    DWORD GetProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, LPCTSTR lpszDefaultValue, LPSTR lpszReturnBuffer, DWORD dwBuffer);
    

    Wie GetPrivatProfileString, halt nur mit der WIN.INI

    BOOL WritePrivateProfileSection(LPCTSTR lpszSectionName, LPCTSTR lpszSectionData, LPCTSTR lpszIniFile);
    

    Beschreibung:
    Schreibt Schlüsselzuweisungen in einen Abschnitt eines INI-Files.

    Rückgabewert:
    Falls erfolgreich TRUE sonst FALSE.

    Parameter:
    Gleiche Parameter siehe GetPrivateProfileInt.

    LPCTSTR lpszSectionData
    

    Zeiger auf einen Puffer, der die Keys und Values des Abschnitts enthält.

    DWORD WritePrivateProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, LPCTSTR lpszStringValue, LPCTSTR lpszIniFileName);
    

    Beschreibung:
    Speichert einen Stringwert im INI-File

    Rückgabewert:
    Wenn erfolgreich TRUE, sonst FALSE.

    Paramter:
    Gleiche Parameter siehe GetPrivateProfileInt.

    LPCTSTR lpszStringValue
    

    Ein Zeiger auf den zu speichernden String.

    DWORD WriteProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, LPCTSTR lpszStringValue);
    

    siehe Write PrivateProfileString , nur eben mit der WIN.INI

    BOOL WritePrivateProfileStruct(LPCTSTR lpszSectionName,LPCTSTR lpszKey, LPVOID lpStruct, UINT uSizeStruct, LPCTSTR lpszIniFile);
    

    Siehe WriteProfileStruct , nur eben mit einem eigenen File.

    DWORD WritePrivateProfileStruct(LPCTSTR lpszSection, LPCTSTR lpszKey, LPVOID lpStruct, UINT uSizeStruct, LPCTSTR lpszFile);
    

    Siehe WriteProfileString, nur eben mit einem eigenen INI-File.

    Und nun ein kleines beispiel, welches einen string und integer speichert und ausliest und eine messagebox ausgibt:

    //************************************************************************************************
    
    #include <afxwin.h>
    //************************************************************************************************
    // cooles mfc-programm !
    //************************************************************************************************
    void main()
    {
    	CString strFileName="c:\\test.ini";
    	CString strSection ="Prefs";
    	CString strKey1    ="String";
    	CString strKey2    ="Zahl";
    
    	CString strValue1="testeintrag";
    	CString strValue2="";
    	DWORD   dwValue=10;
    	strValue2.Format("%d",dwValue);
    
    	WritePrivateProfileString(strSection,strKey1,strValue1,strFileName);
    	WritePrivateProfileString(strSection,strKey2,strValue2,strFileName);
    
    	strValue1="";
    	strValue2="";
    	dwValue=0;
    
    	GetPrivateProfileString(strSection,strKey1,"Default",strValue1.GetBuffer(20),20,strFileName);
    	strValue1.ReleaseBuffer();
    	dwValue = GetPrivateProfileInt(strSection,strKey2,1,strFileName);
    
    	strValue2.Format("%d",dwValue);
    
    	AfxMessageBox(strValue1+" "+strValue2);
    
    }
    
    //************************************************************************************************
    //************************************************************************************************
    //************************************************************************************************
    


  • Sama spinnst du eigentlich? 😃 😉

    Scherz, ich würd das in die FAQ packen.



  • Und wer es gekapselt mag nehme die CINI-Klasse:
    http://www.mindcracker.com/mindcracker/c_cafe/mfc/cini.asp



  • Halleluja, was ist den da passiert ??
    So genau wollte ich das eigentlich gar nicht wissen !!!!
    Wahnsinn.



  • Stimmt, das schreit förmlich nach FAQ !!!! 😮



  • Ganz meine Meinung!
    FAQ, FAQ, FAQ...



  • Das mit der Registry ist mir noch unklar...

    Ich habe folgende Werte der Registry hinzugefügt und es funktioniert trotzdem nicht:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Aktuelle Version\IniFileMapping\MeinProgramm

    Darunter hab ich (Standard) auf folgenden Wert gesetzt:

    USR:Software\MeinProgramm

    Unter HKEY_CURRENT_USER\Software\MeinProgramm
    habe ich einen Schlüssel für jede Gruppe angelegt und darunter die jeweiligen Werte.

    Funktionien tut das aber nicht...

    Kann mir jemand erklären, was ich falsch gemacht habe?

    // EDIT:

    Das was da oben gepostet wurde ist aus der MSDN übersetzt.



  • ...und wenn stört das, dass es die übersetzte MSDN ist ??



  • Hab ich gesagt, dass es stört? Ich meinte nur, dass man das auch in der MSDN nachlesen kann. :p



  • klar, da haste recht, aber manchmal ist doch deutsche hilfe auch nicht schlecht.
    es gibt sicher programmierer, die der englischen sprache nicht 100 % mächtig sind. -glaube ich-
    mfc-newbie hat das zeugs möglicherweise in der msdn nicht gefunden, keine Ahnung.



  • IMHO ist auf die MSDN ein Copywrite.

    Deshalb ist es fraglich ob man das in die FAQ aufnehmen kann.
    Als Posting wäre es IMHO ok weil das posting irgendwann verschwindet.
    Wenn Ernsti nachweisen kann (den Aufwand kann man aber nicht von ihm verlangen) da ses erlaubt ist weil es in der Nutzungsbed. der MSDN so steht dann kommt es in die FAQ.
    Man darf ja auch nicht den Inhalt eines Buches posten.


Anmelden zum Antworten