Frage zu TRegistry
-
Hi Forumsleser,
ich arbeite sehr selten mit c++. Da ich aber gerade eine kleine Projektpause habe, wollte ich mich ein wenig einarbeiten.
Thema ist das Auslesen von Daten aus eine INI-Datei und Schreiben dieser Info in die Registry.
Hier mein Ansatz:
#pragma hdrstop #include "IniFiles.hpp" #include <Registry.hpp> #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { TIniFile *ini; AnsiString strRootKey; AnsiString strSubKey; AnsiString strDefaultDomainName; ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) ); Edit1->Text = ini->ReadString( "data", "RootKey", "HKEY_LOCAL_MACHINE" ); Edit2->Text = ini->ReadString( "data", "SubKey", "\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon" ); Edit3->Text = ini->ReadString( "data", "DefaultDomainName", "Test.Corp" ); delete ini; strRootKey=Edit1->Text; strSubKey=Edit2->Text; strDefaultDomainName=Edit3->Text; //die Werte jetzt in die Registry schreiben // TRegistry-Objekt erzeugen: TRegistry *pReg = new TRegistry; try { pReg -> RootKey = strRootKey; // Schlüssel in der Registrierung öffnen / ggf. erzeugen: pReg->OpenKey(strSubKey, true); // Daten in die Registrierung schreiben: pReg->WriteString("DefaultDomainName",strDefaultDomainName); } __finally { delete pReg; } }1. Fehler: pReg -> RootKey = strRootKey; //Kann AnsiString nicht in void ...
Wenn ich hier statt strRootKey HKEY_LOCAL_MACHINE verwende, kommt es zu einer Fehlermeldung Exception ...Fehler beim Setzen der Daten für "DefaultDomainName"...
Wer kann ir kurz erklären, was ich falsch mache. Muß man die Strings umwandeln oder ähnliches.
Danke für die Hilfe!
Uwe Schönfeld
-
Hallo,
TRegistry::Rootkey ist vom Typ HKEY (das wahrscheinlich ein typedef auf void*). Somit kannst du hier keinen String zuweisen sondern nur eine der vordefinierten Konstanten (in winreg.h).
Du kannst einen String nicht direkt in HKEY umwandeln. Du könntest dir aber eine Funktion schreiben, die abhängig von einen String den entsprechenden HKEY-Wert zurückgibt.pReg->RootKey = HKEY_LOCAL_MACHINE;sollte aber funktionieren. Vielleicht hast du ja auch keinen Zugriff auf HKEY_LOCAL_MACHINE (zumindest keinen Schreibzugriff).
-
Sorry, dass ich so spät reagiere aber ich hatte mich vergessen einzuloggen und somit wurde meine Antwort nicht übertragen.
Danke für die Hilfe.
Wenn ich jetzt:
{ pReg -> RootKey = HKEY_LOCAL_MACHINE; // Schlüssel in der Registrierung öffnen / ggf. erzeugen: pReg->OpenKey(strSubKey, true); // Daten in die Registrierung schreiben: pReg->WriteString("DefaultDomainName",strDefaultDomainName); } __finally { delete pReg;kommt es zu der Fehlermeldung:Exception ...Fehler beim Setzen der Daten für "DefaultDomainName"...
Wenn ich aber:
{ pReg -> RootKey = HKEY_LOCAL_MACHINE; // Schlüssel in der Registrierung öffnen / ggf. erzeugen: pReg->OpenKey("\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", true); // Daten in die Registrierung schreiben: pReg->WriteString("DefaultDomainName",strDefaultDomainName); } __finally { delete pReg;schreibe klappt's.
Also wird och irgendwie der AnsiString an dieser Stelle nicht richtig übernommen. Oder?
Uwe
-
Kann schon sein.
Hast du mal im Debugger den Inhalt von strSubKey überprüft. Du kannst auch den Rückgabewert von OpenKey überprüfen (false wenn nicht erfolgreich).