Programmeinstellungen wie am besten speichern?



  • Hallo,

    ich möchte gerne ein paar Einstellungen meines Programms speichern. Am liebsten würde ich dies in einer xml Datei erledigen. Gibt es in den MFC dafür eine geeignete Vorgehensweise ?

    LG und ein schönes WE



  • Nimm doch z.B. eine ini-Datei. Sehr einfach zu handhaben (ReadPrivateProfile..., WritePrivateProfile...).



  • Die Idee hatte ich auch schon aber ehrlich gesagt wäre mir ne XML noch lieber 🙂



  • Warum? Für die meisten Programmeinstellungen ist die Registry der richtige Platz. Ansonsten MSXML.



  • Danke erstmal.
    Habe mich jetzt doch für die Registryvariante entschieden.
    Verzweifele jedoch beim Versuch einen Value(String) aus der Registry zu lesen.
    Hier mal mein Code:

    LPTSTR buffer;
    	DWORD dwCount; 
    	DWORD dwValue;
    	key.Open( HKEY_CURRENT_USER, L"SOFTWARE\\PFAD", KEY_READ);
    	key.QueryValue(buffer, L"SelfLead", &dwCount);
    

    Für DWORDS klappt das ganze jedoch ganz super.
    Sobald ich nun etwas mit buffer machen will bekomme ich jedemenge Laufzeit Errors.
    Ich bin gerade am verzweifeln



  • Du musst auch Speicher anfordern, damit überhaupt was gespeichert werden kann.

    LPTSTR buffer;
    

    Das ist erstmal nur ein Zeiger. Er zeigt aber noch nicht auf einen gültigen Speicherbereich...



  • haste vlt ein kleines Beispiel 🙂



  • char *pBuffer;    //das ist ein Zeiger, er zeigt aber noch nicht auf einen gültigen Speicherbereich. Da reinschreiben ist nicht so gut...
    
    char buffer[256];  //hier deklarierst du ein array of char mit 256 Elementen => gültiger Speicherbereich!
    
    pBuffer=&buffer[0];  //jetzt zeigt pBuffer übrigens auf gültigen Speicher, da ihm die Adresse des ersten Elements vom Array buffer zugewiesen wird.
    

    Also auf dein Problem bezogen schreibst du einfach:

    char buffer[256];
    

    Wobei du 256 durch die maximale Anzahl an Zeichen, die von der Funktion gefüllt werden kann, ersetzen solltest.



  • Genau das war ja mein erster Lösungsansatz(hier im Forum gelesen)

    bekomme dann aber folgenden Fehler

    cannot convert parameter 1 from 'char [48]' to 'LPTSTR'
    


  • sirchillalot schrieb:

    Genau das war ja mein erster Lösungsansatz(hier im Forum gelesen)

    bekomme dann aber folgenden Fehler

    cannot convert parameter 1 from 'char [48]' to 'LPTSTR'
    

    Poste diesen Versuch bitte mal.



  • Ich hab vor ewigkeiten mal eine Funktion dafür geschrieben

    //key= "SYSTEM\\CurrentControlSet" (z.B.) 
    //value= "DeviceDesc" (z.B.)
    
    CString CRegSearchDlg::ReadRegKey(CString key, CString value) 
    {
    	DWORD dwData = 256;
    	BYTE cDaten[256];
    	HKEY hKey;
    	CString string;
    
    	RegOpenKey(HKEY_LOCAL_MACHINE, key, &hKey);			
    	RegQueryValueEx(hKey, value, 0, 0, cDaten, &dwData);
    	RegCloseKey(hKey);
    
    	string.Format(_T("%s"), cDaten);
    
    	return string;
    }
    


  • Ich nehme immer RegQueryValueEx() zum Lesen und RegSetValueEx() zum schreiben. Hier mal ein Beispiel aus einem Funktionsrumpf. Ich schreibe am Anfang immer das Änderungsdatum, die Uhrzeit und den Benutzer da rein.

    HKEY	hKey;
    
    	CString LastModificationDate;
    	CString LastModificationTime;
    
    	SYSTEMTIME SysTime; 
    	GetLocalTime(&SysTime);
    	LastModificationDate.Format("%02d.%02d.%4d",SysTime.wDay,SysTime.wMonth,SysTime.wYear);
    	LastModificationTime.Format("%02d:%02d:%02d Uhr",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
    
    	char* pIniModificationDate = new char[LastModificationDate.GetLength()+1];
    	sprintf(pIniModificationDate, _T("%s\0"), LastModificationDate);
    
    	char* pIniModificationTime = new char[LastModificationTime.GetLength()+1];
    	sprintf(pIniModificationTime, _T("%s\0"), LastModificationTime);
    
    	char* pIniPfad = new char[m_csFolder.GetLength()+1];
    	sprintf(pIniPfad, _T("%s\0"), m_csFolder); 
    
    	char* pIniDateiname = new char [m_csFilename.GetLength()+1];
    	sprintf(pIniDateiname, _T("%s\0"), m_csFilename);
    
    	char* pIniLastUser = new char [m_csBenutzername.GetLength()+1];
    	sprintf(pIniLastUser, _T("%s\0"), m_csBenutzername);
    
    	LONG	l_ErrCde=(LONG)NULL;
    ...
    
    	//Öffnen bzw. Erstellen eines Schlüssels
    	l_ErrCde=RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Mein Firmenname\\Meine Applikation\\Einstellungen",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,0);
    	if (l_ErrCde!=ERROR_SUCCESS) 
    	{
    		AfxMessageBox("Fehler",MB_OK |MB_ICONEXCLAMATION);
    	}
    	l_ErrCde=RegSetValueEx(hKey,"#Date_lastModification",0,REG_SZ,(BYTE*)pIniModificationDate,LastModificationDate.GetLength()+1);
    	if (l_ErrCde!=ERROR_SUCCESS) 
    	{
    		AfxMessageBox("Fehler beim Schreiben in die Registry!",MB_OK |MB_ICONEXCLAMATION);
    ...
    	}
    


  • _matze schrieb:

    sirchillalot schrieb:

    Genau das war ja mein erster Lösungsansatz(hier im Forum gelesen)

    bekomme dann aber folgenden Fehler

    cannot convert parameter 1 from 'char [48]' to 'LPTSTR'
    

    Poste diesen Versuch bitte mal.

    CRegKey key;
    	char buffer[48];
    	DWORD dwCount = 48; 
    	key.Open( HKEY_CURRENT_USER, L"SOFTWARE\\PFAD", KEY_READ);
    	key.QueryValue(buffer, L"SelfLead", &dwCount);
    


  • sirchillalot schrieb:

    CRegKey key;
    	char buffer[48];
    	DWORD dwCount = 48; 
    	key.Open( HKEY_CURRENT_USER, L"SOFTWARE\\PFAD", KEY_READ);
    	key.QueryValue(buffer, L"SelfLead", &dwCount);
    

    Da dein Projekt auf Unicode eingestellt ist, müsstest du hier auch wchar_t als Typ nehmen (oder gleich sowas wie TCHAR). Das ist vermutlich der Grund, warum es nicht geklappt hat.



  • Danke jetzt gehts



  • ah, die böse Unicode-Falle



  • Ich darf mal kurz dazwischenfragen:

    Wenn ich für ein Programm eine Art Loginsystem bastel, wie oder besser wo
    speichere ich das Adminpasswort dann am besten ab?
    Ich habe keine DB zur Verfügung, muss also entweder irgendwie das Passwort
    verschlüsselt in einer ini oderso speichern, oder halt in der Registry.

    Nehme ich dann Local_Machine und verschlüssel es zusätzlich?
    Aber der Login für einen Admin soll halt auch über einen eingeschränkten
    Useraccount in Windows möglich sein (und diese haben ja oft keine Rechte auf Locale_Machine).



  • Shoggy schrieb:

    Ich darf mal kurz dazwischenfragen:

    Wenn ich für ein Programm eine Art Loginsystem bastel, wie oder besser wo
    speichere ich das Adminpasswort dann am besten ab?
    Ich habe keine DB zur Verfügung, muss also entweder irgendwie das Passwort
    verschlüsselt in einer ini oderso speichern, oder halt in der Registry.

    Nehme ich dann Local_Machine und verschlüssel es zusätzlich?
    Aber der Login für einen Admin soll halt auch über einen eingeschränkten
    Useraccount in Windows möglich sein (und diese haben ja oft keine Rechte auf Locale_Machine).

    Klar darfst du. Ich hab das mit MD5 kodiert und leg das üblicherweise in ner Datenbank ab. Das Gehühner mit local maschine kenn ich, deshalb schreib ich das codierte Passwort in ne Binärdatei, die im Programmverzeichnis liegt. Somit fällts nicht so leicht auf. Du musst die ja nicht grad Passwort.* nennen. Was auch gehen könnte, das via Serialisierung rüber zu schieben.


Anmelden zum Antworten