Klucze rejestru

Adam Boduch

Ostatnio na grupie dyskusyjnej pl.comp.lang.delphi pojawił się post, w którym człowiek szukał sposobu na zapisanie określonej wartości z rejestru do pliku .reg. Zainspirowało mnie to do napisania programiku...

W sumie polega to jedynie na:
*Odczytaniu konkretnej wartości z rejestru
*Przypisaniu jej do zmiennej
*Zapisaniu danych w odpowiednim formacie w pliku .reg

No to zaczynamy. Przede wszystkim należy zapoznać się z formatem pliku .reg. Poniżej znajduje się przykład takiego pliku:

<code>REGEDIT4

[HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Editor\Options]
"NoCtrlAltKeys"="1"

Pierwsza linijka to nagłówek pliku <b>.reg</b>. Następnie w nawiasie kwadratowym znajduje się ścieżka klucza. Kolejne linijki (może być ich kilka) to wartości klucza, wraz z przypisanymi im danymi.

Wiele spraw już się wyjaśniło, prawda? Teraz cała sztuka polega na napisaniu odpowiedniej procedury. W ogólnym założeniu procedura powinna odczytać wybraną wartość z rejestru i zapisać ją do pliku w odpowiednim formacie.

```delphi
procedure TMainForm.btnMakeClick(Sender: TObject);
var
  TF  : TextFile;  // format pliku
  Reg : TRegistry;
  Value : String;
begin
  AssignFile(TF, 'registry.reg'); // stworz plik .REG
  ReWrite(TF);
  Reg := TRegistry.Create;
  try
  { w zaleznosci od wpisanego w Edit pola przypis klucz glowny }
    if edtHomeKey.Text='HKEY_CLASSES_ROOT' then
      Reg.RootKey := HKEY_CLASSES_ROOT;
    if edtHomeKey.Text='HKEY_CURRENT_USER' then
      Reg.RootKey := HKEY_CURRENT_USER;
    if edtHomeKey.Text='HKEY_LOCAL_MACHINE' then
      Reg.RootKey := HKEY_LOCAL_MACHINE;
    if edtHomeKey.Text='HKEY_USERS' then
      Reg.RootKey := HKEY_USERS;
    if edtHomeKey.Text='HKEY_CURRENT_CONFIG' then
      Reg.RootKey := HKEY_CURRENT_CONFIG;
    if edtHomeKey.Text='HKEY_DYN_DATA' then
      Reg.RootKey := HKEY_DYN_DATA;

  { sprawdz, czy istnieje klucz podany przez uzytkownika }
    if not Reg.KeyExists(edtKeyName.Text) then begin 
      ShowMessage('Brak takiego klucza!'); Exit; end;

    Reg.OpenKey(edtKeyName.Text, FALSE);  // otworz klucz...
  { nastepnie sprawdz, czy w kluczu istnieje dana wartosc }
    if not Reg.ValueExists(edtValueName.Text) then begin 
       ShowMessage('Brak takiej wartości!'); Exit; end;

    Value := Reg.ReadString(edtValueName.Text); // odczytaj wartosc

  { zapisz odczytane z pliku dane }
    Writeln(TF, 'REGEDIT4');
    Writeln(TF, '');
    Writeln(TF, '');
    Writeln(TF, '[' + edtHomeKey.Text + '' + edtKeyName.Text + ']');
    Writeln(TF, '"' + edtValueName.Text + '"="' + Value + '"');
  finally
    Reg.Free; // zamknij rejestr
    CloseFile(TF); // zamknij plik
  end;
end;

Może krótkie objaśnienie...
Na samym początku procedura pobiera dane wprowadzone do kontrolek TEdit zawierające lokalizację wybranej wartości w rejestrze. Po ustawieniu odpowiedniego klucza głównego oraz stwierdzeniu istnienia podanego klucza i wybranej wartości procedura przypisuje tę wartość do zmiennej, po czym zapisuje ją do pliku .reg w odpowiednim formacie. To wszystko!

Zaznaczam, że podany tu przykład nie jest gotowym programem zapisującym wszystkie możliwe formaty danych dostępne w rejestrze. Pobiera on tylko wartości, które są łańcuchem tekstowym, a nie np. zapisane binarnie.

4 komentarzy

Artykuł mało kompletny, bo pozwala na eksport tylko stringów, ale bez kluczy Default oraz tych ciągów tekstowych,
które na przykład zawierają znak " polecam. Z tego co widze w google niestety trafia się na ten artykuł, dlatego też
polecam mój gotowiec na: Eksport klucza Rejestrów do pliku *.reg :)

fajne, mi się przydało - dzięki

hmm.... niby nic skomplikowanego ale fajna sprawa :)