# RegQueryValueEx - wie geht des



## Tasm-Devil (21. März 2005)

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";


```
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.


----------



## Beichtpfarrer (21. März 2005)

Erstmal sollte *DWORD lpcvData = sizeof(dwText)* statt =10.
Dann: hast du denn den Betreffenden Subkey bereits geöffnet?
(RegOpenKey)


----------



## Tasm-Devil (21. März 2005)

Heureka

 danke dir du hast mir nen denkanstoss gegeben


```
//---------------------------------------------------------------------------
 
 #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;
 }
 //---------------------------------------------------------------------------
```


----------



## Beichtpfarrer (21. März 2005)

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.


----------



## Tasm-Devil (22. März 2005)

code bitte


----------



## Beichtpfarrer (22. März 2005)

```
//---------------------------------------------------------------------------
 __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;
}
```


----------



## Tasm-Devil (25. März 2005)

bigges thx

 werds demnächst ma probben

 aber hab im mom keine zeit - schaffä


----------

