GetPrivateProfileString



  • Ich habe folgendes Problem:
    Ich möchte aus einer *.ini einen Wert auslesen, und zwar den Wert der hinter "checkBox1" steht.

    Das steht alles in der *.ini:

    [NormaleEinstellungen]
    checkBox1=Inaktiv
    checkBox2=Inaktiv
    

    Und das habe ich als Code:

    char NormaleEinstellungen[500]; 
    DWORD destSize; 
    
    destSize=500;
    
    GetPrivateProfileString("NormaleEinstellungen","checkBox1","Inaktiv",NormaleEinstellungen,destSize,"C:\\Users\\*****\\Desktop\\Rechner\\Meldung.ini");
    label1->Text = System::Convert::ToString(NormaleEinstellungen);
    

    Das schreiben mit funktioniert wunderbar, nur das auslesen nicht.
    Ich bekomme als Wert in label1 immer "True" ausgegeben. 😕



  • label1->Text = gcnew System::String(NormaleEinstellungen);
    

    müsste gehen...



  • Okay, das klappt jetzt.

    Habe aber nun noch ein Problem...

    Undzwar möchte ich, dass wenn meine Form3 (Meine Einstellungen) geladen werden, die CheckBoxen überprüft werden.

    Also zum speichern benutze ich das hier

    switch ( checkBox1->CheckState ) {
    			 case CheckState::Checked:
    				 WritePrivateProfileString("NormaleEinstellungen","checkBox1","Aktiv","C:\\Users\\###\\Desktop\\Privat\\Scripting\\Rechner\\Meldung.ini");
    				 break;
    			 case CheckState::Unchecked:
    				 WritePrivateProfileString("NormaleEinstellungen", "checkBox1", "Inaktiv", "C:\\Users\\###\\Desktop\\Privat\\Scripting\\Rechner\\Meldung.ini");
    				 break;
    			 }
    			 switch ( checkBox2->CheckState ) {
    			 case CheckState::Checked:
    				 WritePrivateProfileString("NormaleEinstellungen","checkBox2","Aktiv","C:\\Users\\###\\Desktop\\Privat\\Scripting\\Rechner\\Meldung.ini");
    				 break;
    			 case CheckState::Unchecked:
    				 WritePrivateProfileString("NormaleEinstellungen","checkBox2","Inaktiv","C:\\Users\\###\\Desktop\\Privat\\Scripting\\Rechner\\Meldung.ini");
    				 break;
    			 }
    

    Und zum auslesen das:

    char cWert[255] = { 0 };
    
    GetPrivateProfileString("NormaleEinstellungen", "checkBox1", "", cWert, 255, "C:\\Users\\###\\Desktop\\Privat\\Scripting\\Rechner\\Meldung.ini");
    

    Ich würde das dann ganz gerne in einer if Schleife verpacken mit checkBox1->Checked = true;

    Mein Problem ist nun das Verständnis mit cWert und 255, also die Sache mit char. da Verstehe ich noch nicht wofür das gut sein soll und ich weiß nicht wie ich den if Befehl schreiben soll.

    Also

    if ( checkBox1 = Aktiv ) {
    checkBox1->Checked = true;
    } else if ( checkBox1 = Inaktiv ) {
    checkBox1->Checked = false;
    }
    

    Funktioniert nicht so, wie ich das gerne hätte. Ich denke mal das checkBox1 vor Aktiv oder Inaktiv ist falsch, aber was müsste stattdessen dahin ?
    Dafür muss ich wissen was es mit dem char und so weiter auf sich hat 😕



  • Mein Problem ist nun das Verständnis mit cWert und 255, also die Sache mit char. da Verstehe ich noch nicht wofür das gut sein soll und ich weiß nicht wie ich den if Befehl schreiben soll.

    char cWert[255] = { 0 };
    GetPrivateProfileString("NormaleEinstellungen", "checkBox1", "", cWert, 255, "C:\\Users\\###\\Desktop\\Privat\\Scripting\\Rechner\\Meldung.ini");
    

    Zeile 1: Es wird ein char-Array mit dem Namen cWert und Platz für 255 Elementen angelegt.
    Zeile 2: Das char-Array mit dem Namen cWert wird der Funktion GetPrivateProfileString(..) übergeben, es zerfällt zum erwarteten LPTSTR (hier char*). 255 wird derselben Funktion übergeben und teil ihr mit, dass in cWert Platz für 255 Elemente ist.

    Hier noch die Doku zu GetPrivateProfileString(..):
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms724353.aspx

    Edit:
    Hier noch der zweite Teil der Antwort...

    Mein Problem ist nun das Verständnis mit cWert und 255, also die Sache mit char. da Verstehe ich noch nicht wofür das gut sein soll und ich weiß nicht wie ich den if Befehl schreiben soll.

    Vermutlich suchst du in etwa das:

    char cWert[255] = { 0 };
    GetPrivateProfileString("NormaleEinstellungen", "checkBox1", "", cWert, 255, "C:\\Users\\###\\Desktop\\Privat\\Scripting\\Rechner\\Meldung.ini");
    System::String^ wert = gcnew System::String(cWert); // cWert in ein .NET-freundliches Format konvertieren
    if (wert == "Aktiv")
    {
      checkBox1->Checked = true;
    }
    else if (wert == "Invativ")
    {
        checkBox1->Checked = false;
    }
    


  • Warum das alles? Unter .NET gibts viel bessere Möglichkeiten, Configs zu lesen und zu schreiben, als diese WinApi Funktionen.



  • theta schrieb:

    Mein Problem ist nun das Verständnis mit cWert und 255, also die Sache mit char. da Verstehe ich noch nicht wofür das gut sein soll und ich weiß nicht wie ich den if Befehl schreiben soll.

    char cWert[255] = { 0 };
    GetPrivateProfileString("NormaleEinstellungen", "checkBox1", "", cWert, 255, "C:\\Users\\###\\Desktop\\Privat\\Scripting\\Rechner\\Meldung.ini");
    

    Zeile 1: Es wird ein char-Array mit dem Namen cWert und Platz für 255 Elementen angelegt.
    Zeile 2: Das char-Array mit dem Namen cWert wird der Funktion GetPrivateProfileString(..) übergeben, es zerfällt zum erwarteten LPTSTR (hier char*). 255 wird derselben Funktion übergeben und teil ihr mit, dass in cWert Platz für 255 Elemente ist.

    Hier noch die Doku zu GetPrivateProfileString(..):
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms724353.aspx

    Edit:
    Hier noch der zweite Teil der Antwort...

    Mein Problem ist nun das Verständnis mit cWert und 255, also die Sache mit char. da Verstehe ich noch nicht wofür das gut sein soll und ich weiß nicht wie ich den if Befehl schreiben soll.

    Vermutlich suchst du in etwa das:

    char cWert[255] = { 0 };
    GetPrivateProfileString("NormaleEinstellungen", "checkBox1", "", cWert, 255, "C:\\Users\\###\\Desktop\\Privat\\Scripting\\Rechner\\Meldung.ini");
    System::String^ wert = gcnew System::String(cWert); // cWert in ein .NET-freundliches Format konvertieren
    if (wert == "Aktiv")
    {
      checkBox1->Checked = true;
    }
    else if (wert == "Invativ")
    {
        checkBox1->Checked = false;
    }
    

    Woa danke, echt eine super Antwort, habe jetzt alles verstanden und es funktioniert auch alles, ich danke dir vielmals, echt super erklärt !

    Und @Mechanics, ich weiß leider nicht welche, ich fand diese jetzt eigentlich ziemlich effektiv. War halt nur Anfangs etwas kompliziert. 🙂



  • Naja.. Erstmal natürlich:
    http://www.c-plusplus.net/forum/263084

    Und eine alternative Klasse (aber halt C#):
    http://dotnet-snippets.de/snippet/erweiterte-ini-datei-klasse/1307

    Hat den Vorteil, dass die Datei einmal eingelesen und dann darauf zugegriffen wird und die datei nicht für jeden Zugriff geöffnet und dannach wieder geschlossen wird.


Anmelden zum Antworten