Registrypfad aus Datei auslesen?

exx452

Grünschnabel
Hallo

Ich möchte einen bestimmten Wert aus der Registry auslesen, aber den Registry Pfad möchte ich vorher aus einer Textdatei auslesen, falls sich mal was ändert.

Inhalt der Datei config.txt:
Code:
regkey	HKEY_LOCAL_MACHINE
regpath	SOFTWARE\\Test
regname	Text
Code:
#include <fstream>
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

int main()
{
//Code zum Auslesen der config.txt 
string name,regkey,regpath,regname;

ifstream cfgfile;
cfgfile.open("config.txt", ios_base::in);
if(!cfgfile) return 1;
					
for(;name != "regkey";cfgfile >> name >> regkey);
for(;name != "regpath";cfgfile >> name >> regpath);
for(;name != "regname";cfgfile >> name >> regname);

cfgfile.close();

// Code zum Auslesen der Registry 
HKEY key;
DWORD dwType;
DWORD dwSize=300;
char regwert[300];

RegOpenKeyEx(regkey, regpath,0,KEY_READ, &key);
RegQueryValueEx(key, regname,NULL,&dwType,(BYTE *)regwert,&dwSize);
RegCloseKey(key);
return 0;
}
Das Problem ist, dass er die Variablen regkey, regpath, regname nicht akzeptiert, weil sie vom typ string sind. Ich weiß nicht wie ich die Datei sonst auslesen.
Hier noch die Fehlermeldung:
Code:
error C2664: 'RegOpenKeyExA' : Konvertierung des Parameters 1 von 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' in 'struct HKEY__ *' nicht moeglich
        Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden
Bitte um Hilfe - Danke :-)
P.S. Ich wollte noch ObScUrItAs danken für den Registry-Auslesen-Code
 
Zuletzt bearbeitet:
Der erste Parameter von RegOpenKeyEx ist vom Typ HKEY. Den musst du per Hand in einen der möglichen sechs(?) Hauptkeys umwandeln:

HKEY hKeyMain = NULL;
if ( regkey == "HKEY_LOCAL_MACHINE" )
{
hKeyMain = HKEY_LOCAL_MACHINE;
}

Geht nicht anders, ausser durch potthässliche Macro-Pfuscherei.

Bei den anderen beiden Parametern wird ein LPCTSTR erwartet, was ein Pointer auf einen Constantes TCHAR-Array ist (oder bei nicht Unicode-Anwendungen ein char*). Dazu verwendest du einfach die .c_str()-Funktion des std::strings:

RegOpenKeyEx( hKeyMain, regpath.c_str(),0,KEY_READ, &key);
 
Super - hat funktioniert - Danke!
Code:
#include <fstream>
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

int main()
{
//Code zum Auslesen der config.txt 
string name,regkey,regpath,regname;

ifstream cfgfile;
cfgfile.open("config.txt", ios_base::in);
if(!cfgfile) return 1;
					
for(;name != "regkey";cfgfile >> name >> regkey);
for(;name != "regpath";cfgfile >> name >> regpath);
for(;name != "regname";cfgfile >> name >> regname);

cfgfile.close();

// Code zum Auslesen der Registry 
HKEY key;
DWORD dwType;
DWORD dwSize=300;
char regwert[300];

HKEY hKeyMain = NULL;
if(regkey == "HKEY_LOCAL_MACHINE") hKeyMain = HKEY_LOCAL_MACHINE;
if(regkey == "HKEY_CURRENT_USER") hKeyMain = HKEY_CURRENT_USER;

RegOpenKeyEx(hKeyMain, regpath.c_str(),0,KEY_READ, &key);
RegQueryValueEx(key, regname.c_str(),NULL,&dwType,(BYTE *)regwert,&dwSize);
RegCloseKey(key);

cout << regwert << endl;
return 0;
}
 
Hi.
exx452 hat gesagt.:
Code:
ifstream cfgfile;
cfgfile.open("config.txt", ios_base::in);
if(!cfgfile) return 1;
					
for(;name != "regkey";cfgfile >> name >> regkey);
for(;name != "regpath";cfgfile >> name >> regpath);
for(;name != "regname";cfgfile >> name >> regname);

cfgfile.close();
Der Code ist ziemlich gefährlich. Was wenn sich die Reihenfolge der Einträge in der Datei mal ändert? Was wenn ein Eintrag gar nicht in der Datei ist? (=> Endlosschleife)

Es wäre wahrscheinlich besser Standardwerte in den Code einzufügen so das die Datei nicht unbedingt vorhanden sein muß und auch nicht unbedingt alle Informationen enthalten muß. Und dann sollte man auf jeden Fall prüfen ob das Lesen auch geklappt hat - und wenn nicht, abbrechen:
Code:
ifstream cfgfile;
cfgfile.open("config.txt", ios_base::in);
if(!cfgfile) return 1;

while (cfgfile >> name >> value) {
  if (name == "regpath")
     regpath = value;
  else if (name == "regkey")
     regkey = value;
  else if (name == "regname")
     regname = value;
  else
     // wtf?
}

Ansonsten schließe ich mich meinem Vorgänger an. ;) (siehe auch MSDN)
 
Zurück