[C++] Registry Einträge schreiben & lesen

sisela

Erfahrenes Mitglied
Hallo Leute

Ich habe eine Internet Anwendung geschrieben und möchte nun gerne IP Adresse und Port nicht, wie im Moment, in der Anwendung festlegen sondern möchte diese in die Registry schreiben und auch lesen.
Nun ist meine
1. Frage wie funktioniert das mit der Registry allgemein und meine
2. Frage wie stellen ich das am besten an.

Ich habe schon gelesen das es GetProfileString und SetProfileString gibt aber die funktionsweise habe ich nicht wirklich verstanden.

Code:
 #ifdef REGISTRY_NAME
	CString Name = AfxGetApp()->GetProfileString(CString(_regSettings) + "\\" + REGISTRY_NAME, "MyName", "");

	AfxGetApp()->WriteProfileString(CString(_regSettings) + "\\" + REGISTRY_NAME, "MyName", Name);

	if (MyName.IsEmpty())
	{
		// use default
		Name = "noName";
	}
#endif

danke schonmal
 
hi
an diesem Problem hänge ich auch gerade.
lesen funktioniert bei mir aber mit schreiben blicke ich nciht wirklich!

Code:
 	RegOpenKey(HKEY_CURRENT_USER, "Software\\Microsoft\\MediaPlayer\\Setup\\CreatedLinks", &hKey);
	RegQueryValueEx(hKey, "AppName", NULL, NULL, temp, &size);

Schreiben versuche ich hiermit:
Code:
	RegSetValue(hKey, NULL,REG_SZ,NULL,NULL);

wäre echt klasse wenn uns jemand ein kurzes Bsp. Programm geben könnte

gruß Michael
 
Hallo zusammen,

ich greif dieses Thema nochmal auf weil es genau meine Problematik darstellt...
Ich hab Code hier wo es mit der VCL unter Borland geht, aber auch nur lesend...
Aber ich hab keine Ahnung wie es unter den MFC läuft.
Werde das hier beschrieben mal antesten,
aber wäre schön wenn sich jemand finden würde der weiß wie man in die
Registry schreibt, Einträge überschreibt und löscht...

Grüße
RuFF^
 
Hallo,

ich denke, zwischen Borland und VC sollte da kein großer Unterschied sein. Registry-Zugriffe werden, zumindest bei VC, nur über Windows-API Funktionen abgewickelt (gibt's dafür bei Borland VCL-Klassen?).

Das Prinzip ist auch recht einfach:

1. Schlüssel öffnen (RegOpenKeyEx)
2. Lesen oder Schreiben (RegSetValueEx, RegQueryValueEx)
Fall der Schlüssel nicht existiert, muss er vorm dem Schreiben angelegt werden (RegCreateKeyEx)
3. Schlüssel schließen (RegCloseKey)
4. ZUm Löschen gibt's RegDeleteKeyEx

Mit den 5 Funktionen kann man eigentlich so gut wie alles abdecken. Aufgrund der verschiedenen möglichen Datentypen muss man ggf. etwas Sorgfalt beim Aufbereiten der Daten nach/aus RegSetValueEx/RegQueryValueEx walten lassen.

Ich häng mal noch ein einfaches Beispiel zum Lesen/Speichern eines Strings dran, hoffentlich fehlerfrei :)

Gruß
MCoder

Code:
/////////////////////////////////////////////////////////////////////
// Lesen:

HKEY hKey;
BOOL bRet = TRUE;

LONG lReturn = RegOpenKeyEx( HKEY_CURRENT_USER,
                             _T("Software\\Microsoft\\MediaPlayer\\Setup\\CreatedLinks"),
                             0L,
                             KEY_ALL_ACCESS,
                             &hKey);

if( lReturn == ERROR_SUCCESS )
{
    CString strData;
    DWORD   dwSize = 1024;
    DWORD   dwType;

    lReturn = RegQueryValueEx( hKey,
                               _T("AppName"),
                               0L,
                               &dwType,
                               (BYTE *)strData.GetBufferSetLength((int)dwSize),
                               &dwSize );
                               
    if( lReturn == ERROR_SUCCESS )
    {
        // OK
    }       
}                                   

RegCloseKey(hKey);

/////////////////////////////////////////////////////////////////////
// Schreiben:

HKEY hKey;
BOOL bRet = TRUE;

LONG lReturn = RegOpenKeyEx( HKEY_CURRENT_USER,
                             _T("Software\\Microsoft\\MediaPlayer\\Setup\\CreatedLinks"),
                             0L,
                             KEY_ALL_ACCESS,
                             &hKey );

if( lReturn != ERROR_SUCCESS ) // Schlüssel existiert wahrscheinlich nicht -> anlegen
{
    DWORD dw;

    lReturn = RegCreateKeyEx( HKEY_CURRENT_USER,
                              _T("Software\\Microsoft\\MediaPlayer\\Setup\\CreatedLinks"),
                              0L,
                              NULL,
                              REG_OPTION_NON_VOLATILE,
                              KEY_ALL_ACCESS,
                              NULL,
                              &hKey,
                              &dw);

    if( lReturn != ERROR_SUCCESS )
    {
        return; // FEHLER  
    }
}

CString strData = _T("BlaBlaBla");

lReturn = RegSetValueEx( hKey,
                         _T("AppName"),
                         0L,
                         REG_SZ,
                         (CONST BYTE *)strData.GetBuffer(strData.GetLength()),
                         (DWORD)(strData.GetLength() * sizeof(TCHAR)) );

strData.ReleaseBuffer();

f( lReturn == ERROR_SUCCESS )
{
    // OK
}       

RegCloseKey(hKey);
 
Hallo

habe mal eine Klasse gefunden, mit der das Lesen und Schreiben recht einfach geht.

Beispiel:

Code:
CRegistry Registry;

CString regPath;
CString strValue;

regPath = "SOFTWARE\\Firma\\Anwendung\\";  

if(!Registry.VerifyKey(HKEY_LOCAL_MACHINE, regPath))  // Check ob Pfad existiert
{
    AfxMessageBox("Pfad existiert nicht");
    return;
}

Registry.Open(HKEY_LOCAL_MACHINE, regPath);  // Open 
Registry.Read("regvalue", strValue);  // Read the value
Registry.Close();  // Close the Registry



konnte den anhang (reg.zip) nicht hinzufügen ... bekomme fehler in PHP-Script. versuch es weiter ....
 
Vielen Dank ;)
Hab im Moment andere Probleme :(
Erst wenn diese behoben sind werde ich mich um die Registry kümmern können...
Der blöde Compiler macht mir zu schaffen...

Grüße und nochmal vielen Dank ;)
RuFF
 
Hallo zusammen,

also erstmal Danke @cFuchs für die Reg klassen...
Die werde ich bestimmt irgendwann mal gebrauchen können ;)
Aber für meine Zwecke reichen die MFC Methoden, die durch CWinApp bereitgestellt werden.

Ich nutze einfach die beiden Methoden
"GetProfileString" und
"WriteProfileString"
Dann gibt es das gleich um numerische Werte ab zu legen...
"GetProfileInt" und
"WriteProfileInt"

Zur verwendung:

Euer Hauptprogramm, welches irgendwie von CWinApp abgeleitet ist, sollte in der "InitInstance()" Methode den folgenden Aufruf beihnhalten:
Code:
SetRegistryKey(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"));

Die MFC Programmierer haben sich das so vorgestellt:

HKEY_CURRENT_USER/Software/MeineFirma/MeineApplikation/

Mit SetRegistryKey wird der Key "MeineFirma" gesetzt.
Der Unter Key "Meine Applikation" wird automatisch gesetzt. (So wie euer Prog heißt)

Mit folgendem Code könnt ihr euch egal wo ihr euch innerhalb eures Progs befindet einen Pointer auf die App Klasse holen:
Code:
CWinApp* pApp = AfxGetApp();

Hier die Speicher Methoden, die jederzeit, mit Hilfe des Pointers, überall im Prog nutzen könnt:
Code:
BOOL WriteProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry,
LPCTSTR lpszValue);
BOOL WriteProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry,
int iValue);

lpszSection = Kategorie, könnt ihr euch selbst aussuchen.
lpszEntry = Eintrag, könnt ihr euch auch selbst aussuchen.
lpszValue bzw. iValue = Wert der zu dem Eintrag gespeichert werden soll.

Beispiel:

Code:
pApp->WriteProfileString("Settings", "Farben", "rot");

Dann sieht das in der Registry folgendermaßen aus:

HKEY_CURRENT_USER/Software/MeineFirma/MeineApplikation/Settings/Farben = "rot"

Zum Auslesen einfach:

Code:
CString farbe = pApp->GetProfileString("Settings", "Farben");

Und fertig^^
 
Ich hab das so gelöst, was auch problemlos funktioniert (oder ist das "unsauber" ? ):

Code:
void Settings::WriteToRegistry()
{
	HKEY hKey = HKEY_CURRENT_USER;
	RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\MyCompany\\MyApplication",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);	
	RegSetValueEx(hKey,"username",0,REG_SZ, (unsigned char*) m_username.GetBuffer(m_username.GetLength()), m_username.GetLength());
	RegCloseKey(hKey);
}

CString Settings::GetUserFromRegistry()
{
	HKEY hKey = HKEY_CURRENT_USER;
	DWORD dwData = 256;
	RegCreateKeyEx(HKEY_CURRENT_USER,"MyCompany\\MyApplication",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
	CString user; 
	RegQueryValueEx(hKey,"username",0,0,(unsigned char*) user.GetBuffer(user.GetLength()),&dwData);
	RegCloseKey(hKey);
	return user;
}
 
Ich kenn mich nicht wirklich mit der Registry aus, also ob das jetzt saueber ist oder nicht...
Aber was ich weiß ist dass die MFC Funktionen, im Falle des nicht vorhandensein einer registry was bei z.B. Win 98 der Fall ist, einfach in die Entdprechenden ini Dateien schreibt. Das bedeutet dass dein Programm Einstellung nicht speichern und wieder auslesen kann auf älteren Systemen...

Grüße RuFF
 

Neue Beiträge

Zurück