Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2011, 00:44   #1
DENIS_1992
Пользователь
 
Регистрация: 29.05.2011
Сообщений: 24
По умолчанию Работа с системным реестром Windows XP

Пишу курсовую работу редактор реестра. Необходимо создать резервную копию подраздела реестра, чтобы иметь возможность по нему восстановить ветвь реестра при необходимости. Пример кода, который я использую:

procedure TForm1.Button1Click(Sender: TObject);
begin
Reg2:=TRegistry.Create;
Reg2.RootKey:=HKEY_CURRENT_USER;
Reg2.SaveKey('HKEY_CURRENT_USER/Console','Filed');{попытка записать в
файл все параметры ветви реестра}
Reg2.CloseKey;
Reg2.Destroy;
end;

После выполнения данного кода, создаётся файл Filed, но в нём ничего нет, он весит 0кб... Не знаю что делать!!!
DENIS_1992 вне форума Ответить с цитированием
Старый 02.06.2011, 01:40   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

1. в вашем коде нет блоков try finally, try .. except
2. Где открытие с правами ALL_ACCESS?
3. SaveKey это булевая функция.


Вы вообще help дельфийский открывали? Откройте! И узнаете много нового!
Человек_Борща вне форума Ответить с цитированием
Старый 02.06.2011, 02:08   #3
DENIS_1992
Пользователь
 
Регистрация: 29.05.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
1. в вашем коде нет блоков try finally, try .. except
2. Где открытие с правами ALL_ACCESS?
3. SaveKey это булевая функция.


Вы вообще help дельфийский открывали? Откройте! И узнаете много нового!
я ток недавно начал работать с реестром, я не знаю как открывать с правами ALL_ACCESS, поэтому и прошу помощи у вас у профи, умел бы работать не создавал бы тему... прошу помощи, а не критики, я ток начинаю программировать...
DENIS_1992 вне форума Ответить с цитированием
Старый 02.06.2011, 05:09   #4
dacorp
Пользователь
 
Регистрация: 12.06.2010
Сообщений: 48
По умолчанию

Сам не пробовал, но нашл у себя на машинке:

Командная строка экспорта (к примеру):
Код:
regedit /e RegData.reg HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
Соответственно чтобы скопировать можно просто обратиться к данной команде:

Код:
uses
  ShellApi;

procedure TMain.ExportBtnClick(Sender: TObject);
var
  FileName, Key: string;
begin
  FileName := ... //заполнить именем файла (расширение указывать)
  Key := ... //заполнить именем ключа, типа
  //Key := 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion'
  if ShellExecute(Handle, 'open', 'regedit.exe',
  PChar(Format('/e "%s" "%s"', [FileName, Key])),
  '', SW_SHOWDEFAULT) <= 32
  then //если ошибка, то возвращаемый код <=32
    RaiseLastWin32Error();
end;
dacorp вне форума Ответить с цитированием
Старый 02.06.2011, 05:10   #5
dacorp
Пользователь
 
Регистрация: 12.06.2010
Сообщений: 48
По умолчанию

Также (спасибо Google) нарыл этот код:
Код:
unit RegExpo;

 interface

 uses
   Windows, rRegistry, Classes, SysUtils;

 {$I-}
 {$LONGSTRINGS ON}

 procedure ExportRegistryBranch(Rootsection: Integer; regroot: string;
   FileName: string);

 implementation

 function dblBackSlash(t: string): string;
 var
   k: longint;
 begin
   Result := t; {Strings are not allowed to have}
   for k := Length(t) downto 1 do {single backslashes}
     if Result[k] = '\' then Insert('\', Result, k);
 end;


 procedure ExportRegistryBranch(rootsection: Integer; Regroot: string;
   FileName: string);
 var
   reg: TRegistry;
   f: Textfile;
   p: PChar;

   procedure ProcessBranch(root: string); {recursive sub-procedure}
   var
     values, keys: TStringList;
     i, j, k: longint;
     s, t: string; {longstrings are on the heap, not on the stack!}
   begin
     Writeln(f); {write blank line}
     case rootsection of
       HKEY_CLASSES_ROOT: s   := 'HKEY_CLASSES_ROOT';
       HKEY_CURRENT_USER: s   := 'HKEY_CURRENT_USER';
       HKEY_LOCAL_MACHINE: s  := 'HKEY_LOCAL_MACHINE';
       HKEY_USERS: s          := 'HKEY_USERS';
       HKEY_PERFORMANCE_DATA: s := 'HKEY_PERFORMANCE_DATA';
       HKEY_CURRENT_CONFIG: s := 'HKEY_CURRENT_CONFIG';
       HKEY_DYN_DATA: s       := 'HKEY_DYN_DATA';
     end;
     Writeln(f, '[' + s + '\' + root + ']'); {write section name in brackets}

     reg.OpenKey(root, False);
     try
       values := TStringList.Create;
       try
         keys := TStringList.Create;
         try
           reg.GetValuenames(values); {get all value names}
           reg.GetKeynames(keys); {get all sub-branches}

           for i := 0 to values.Count - 1 do {write all the values first}
           begin
             s := values[i];
             t := s; {s=value name}
             if s = '' then s := '@' {empty means "default value", write as @}
             else
               s := '"' + s + '"'; {else put in quotes}
             Write(f, dblbackslash(s) + '='); {write the name of the key to the file}

             case reg.Getdatatype(t) of {What type of data is it?}

               rdString, rdExpandString: {String-type}
                 Writeln(f, '"' + dblbackslash(reg.ReadString(t) + '"'));

               rdInteger: {32-bit unsigned long integer}
                 Writeln(f, 'dword:' + IntToHex(reg.readinteger(t), 8));

              {write an array of hex bytes if data is "binary." Perform a line feed 
              after approx. 25 numbers so the line length stays within limits}

               rdBinary:
                 begin
                   Write(f, 'hex:');
                   j := reg.GetDataSize(t); {determine size}
                   GetMem(p, j); {Allocate memory}
                   reg.ReadBinaryData(t, p^, J); {read in the data, treat as pchar}
                   for k := 0 to j - 1 do
                   begin
                     Write(f, IntToHex(Byte(p[k]), 2)); {Write byte as hex}
                     if k <> j - 1 then {not yet last byte?}
                     begin
                       Write(f, ','); {then write Comma}
                       if (k > 0) and ((k mod 25) = 0) {line too long?} then
                         Writeln(f, '\'); {then write Backslash +lf}
                     end; {if}
                   end; {for}
                   FreeMem(p, j); {free the memory}
                   Writeln(f); {Linefeed}
                 end;
               else
                 Writeln(f, '""'); {write an empty string if datatype illegal/unknown}
             end;{case}
           end; {for}
         finally
           reg.CloseKey;
         end;

       finally
         {value names all done, no longer needed}
         values.Free;
       end;

       {Now al values are written, we process all subkeys}
       {Perform this process RECURSIVELY...}
       for i := 0 to keys.Count - 1 do
         ProcessBranch(root + '\' + keys[i]);
     finally
       keys.Free; {this branch is ready}
     end;
   end; { ProcessBranch}


 begin
   if RegRoot[Length(Regroot)] = '\' then {No trailing backslash}
     SetLength(regroot, Length(Regroot) - 1);
   Assignfile(f, FileName); {create a text file}
   Rewrite(f);
   if ioResult <> 0 then Exit;
   Writeln(f, 'REGEDIT4'); {"magic key" for regedit}

   reg := TRegistry.Create;
   try
     reg.Rootkey := Rootsection;
     {Call the function that writes the branch and all subbranches}
     ProcessBranch(Regroot);
   finally
     reg.Free; {ready}
     Close(f);
   end;
 end;

 end.
dacorp вне форума Ответить с цитированием
Старый 02.06.2011, 11:28   #6
DENIS_1992
Пользователь
 
Регистрация: 29.05.2011
Сообщений: 24
По умолчанию

спасибо за помощь!!! осталось только разобраться))
DENIS_1992 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++. Создание класса для работы с реестром Windows Dead Romantic Помощь студентам 0 17.05.2011 16:37
Работа с реестром windows Vlad2104 Помощь студентам 1 11.06.2010 21:17
Cохранить в файл значение заданного имени, тип REG_BINARY. Работа с реестром Windows. DelphiFun Общие вопросы Delphi 9 01.08.2007 21:36
работа с реестром. kozei Win Api 6 17.07.2007 13:31