RegQueryValueEx - wie geht des

Tasm-Devil

Erfahrenes Mitglied
also Leute neues Thema neues Problem.

ich kann einen Schlüssel in die Registrie machen und was reinschreiben aber wie kann ich einen Werrt später wieder lesen.

HKEY Key = HKEY_LOCAL_MACHINE;
LPCTSTR subkey = "SOFTWARE\\TestKey";

Code:
 char dwText [MAX_PATH] = "";
 DWORD lpcbData = 10;
 LPTSTR lpValueName = "value";
 RegQueryValueEx(Key, lpValueName, NULL, REG_NONE, dwText, &lpcbData);
 Edit2->Text = dwText;

das geht aber nicht.

Und bitte keinen Link auf ne andere Seite hier im Forum, die kenne ich schon.
 
Erstmal sollte DWORD lpcvData = sizeof(dwText) statt =10.
Dann: hast du denn den Betreffenden Subkey bereits geöffnet?
(RegOpenKey)
 
Heureka

danke dir du hast mir nen denkanstoss gegeben

Code:
//---------------------------------------------------------------------------
 
 #include <vcl.h>
 #pragma hdrstop
 
 #include "Unit1.h"
 //---------------------------------------------------------------------------
 #pragma package(smart_init)
 #pragma resource "*.dfm"
 TForm1 *Form1;
 HKEY Key = HKEY_LOCAL_MACHINE;
 LPCTSTR subkey = "SOFTWARE\\TestKey";
 
 //---------------------------------------------------------------------------
 __fastcall TForm1::TForm1(TComponent* Owner)
 		: TForm(Owner)
 {
 }
 //---------------------------------------------------------------------------
 
 void __fastcall TForm1::Button1Click(TObject *Sender)
 {
 
 RegCreateKeyEx(Key, subkey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &Key, NULL);
 RegSetValueEx(Key , "value" , 0 , REG_SZ , Edit1->Text.c_str(), Edit1->Text.Length());
 
 }
 //---------------------------------------------------------------------------
 void __fastcall TForm1::Button2Click(TObject *Sender)
 {
 RegOpenKey(Key,subkey,&Key);
 char dwText [MAX_PATH] = "";
 DWORD lpcbData = sizeof(dwText);
 LPTSTR lpValueName = "value";
 RegQueryValueEx(Key, lpValueName, NULL, REG_NONE, dwText, &lpcbData);
 Edit2->Text = dwText;
 }
 //---------------------------------------------------------------------------
 
Nein! So kannst du das auch nicht machen!
Nimm doch mal an, es wird jetzt der Button1 vor dem Button 2 geklickt!
Oder nimm an, der Button2 wird mehr als einmal geklickt!
Was passiert dann?
Du musst den Key in einer anderen Methode Öffnen... bzw, wenn er global ist (was eigentlich unschön ist), sollte er (der Handle-Wert) in der Klasse gar nicht manipuliert werden.
Also: ich würde den HKEY nur lokal anlegen, zur Not geht auch als Member.
 
Code:
 //---------------------------------------------------------------------------
 __fastcall TForm1::TForm1(TComponent* Owner)
 		: TForm(Owner)
 {
 }
 //---------------------------------------------------------------------------
 
 void __fastcall TForm1::Button1Click(TObject *Sender)
 {
 HKEY hKey; 
 RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\TestKey", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL);
 RegSetValueEx(hKey , "value" , 0 , REG_SZ , Edit1->Text.c_str(), Edit1->Text.Length());
 RegCloseKey(hKey);
 
 }
 //---------------------------------------------------------------------------
 void __fastcall TForm1::Button2Click(TObject *Sender)
 {
 HKEY hKey; 
 RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\TestKey",&hKey);
 char dwText [MAX_PATH] = ""; // bzw du könntest auch erst durch einen aufruf von RegQueryValueEx die benötigte Bufferlänge herausfinden und erst dann dynamisch allokieren.
 DWORD lpcbData = sizeof(dwText);
 RegQueryValueEx(hKey, "value", NULL, REG_NONE, dwText, &lpcbData);
 RegCloseKey(hKey);
 Edit2->Text = dwText;
}
 
Zurück