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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2012, 10:07   #1
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию Копирование ключей реестра

Всем привет. Поискал по форуму нечто подобное, но не нашел, поэтому создал тему (сори если все-таки есть).

Проблема встала следующая:

Есть ключ реестра в секции HKEY_LOCAL_MACHINE\SOFTWARE\, у этого ключа есть несколько подключей, в каждом хранятся параметры разных типов.
Надо копировать этот ключ со всеми его подключами и значениям в секцию HKEY_CURRENT_USER\Software\

Никак не могу это реализовать пробовал испльзовать
MoveKey, но, я так понял, данная процедура не позволяет копировать ключи между секциями, а только в рамках одной.
Код:
Procedure TFrmMain.RegCopy(aKey: String);
var
  Reg: TRegistry;
  SL: TStringList;
  i: integer;
begin
  try
   SL:=TStringList.Create;

   Reg:=TRegistry.Create;
   Reg.RootKey:=HKEY_LOCAL_MACHINE;
   Reg.OpenKey('\SOFTWARE\'+aKey, false);
   Reg.GetKeyNames(SL);

   Reg.RootKey:=HKEY_CURRENT_USER;
   Reg.OpenKey('\Software', false);

   for i:=0 to Sl.Count-1 do
    Reg.MoveKey(SL[i], '\'+aKey+'\'+SL[i], false);

  except
   FreeAndNil(Reg);
   FreeAndNil(SL);
  end;
end;
Пробовал с указанием полного пути в MoveKey, но эффекта 0.

Пробовал через CreateKey:
Код:
Procedure TFrmMain.RegCopy(aKey: String);
var
  Reg: TRegistry;
  SL: TStringList;
  i: integer;
begin
  try
   SL:=TStringList.Create;

   Reg:=TRegistry.Create;
   Reg.RootKey:=HKEY_LOCAL_MACHINE;
   Reg.OpenKey('\SOFTWARE\'+aKey, false);
   Reg.GetKeyNames(SL);

   Reg.RootKey:=HKEY_CURRENT_USER;
   Reg.OpenKey('\Software', false);

   for i:=0 to Sl.Count-1 do
    Reg.CreateKey('\'+aKey+'\'+SL[i]);

  except
   FreeAndNil(Reg);
   FreeAndNil(SL);
  end;
end;
В этом случае основной ключ и подключи создаются, но вот как скопировать параметры учитывая их типы не знаю


Помогите, пожалуйста
{Shadowevil} вне форума Ответить с цитированием
Старый 08.08.2012, 10:59   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Код:
LoadKey
RestoreKey
SaveKey
а через файл не лучше?
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 08.08.2012, 11:00   #3
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Посмотри у себя в модуле Registry реализацию метода TRegistry.MoveKey, в частности внутри есть локальные процедуры CopyKeys, CopyValues.
astecenko вне форума Ответить с цитированием
Старый 08.08.2012, 14:42   #4
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
Код:
LoadKey
RestoreKey
SaveKey
а через файл не лучше?
Нет, не лучше, могут возникнуть проблемы с доступом
{Shadowevil} вне форума Ответить с цитированием
Старый 08.08.2012, 14:43   #5
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от astecenko Посмотреть сообщение
Посмотри у себя в модуле Registry реализацию метода TRegistry.MoveKey, в частности внутри есть локальные процедуры CopyKeys, CopyValues.
Посмотрел, а толку? Редактировать модуль не очень хочется, а заимствовать оттуда что-то смысла нет.


Накидал вот такую процедурку, пока работает, может кому пригодится:

Код:
Procedure TFrmMain.RegCopy(aKey: String);
var
  Reg, Reg2: TRegistry;
  SL: TStringList;
  i: integer;
  DT: TRegDataInfo;
begin
  try
   SL:=TStringList.Create;

   Reg:=TRegistry.Create;
   Reg.RootKey:=HKEY_LOCAL_MACHINE;             //откуда
   Reg.OpenKey(aKey, false);
   Reg.GetValueNames(SL);

   Reg2:=TRegistry.Create;
   Reg2.RootKey:=HKEY_CURRENT_USER;             //куда
   if Reg2.KeyExists(aKey) then exit;
   Reg2.OpenKey(aKey, True);

    for i:=0 to Sl.Count-1 do
   begin
     DT.RegData:=Reg.GetDataType(SL[i]);
     if (DT.RegData=rdInteger) then                        
      Reg2.WriteInteger(SL[i], Reg.ReadInteger(SL[i]));
     if (DT.RegData=rdString) then
      Reg2.WriteString(SL[i], Reg.ReadString(SL[i]));
    end;
   Reg.GetKeyNames(SL);

   for i:=0 to Sl.Count-1 do
   begin
    RegCopy(aKey+'\'+SL[i]);
   end;

  except
   FreeAndNil(Reg);
   FreeAndNil(Reg2);
   FreeAndNil(SL);
  end;
end;
//эти условия проверяют только 2 типа параметров - численные и строковые,
если надо проверить другие типы, придется добавить подобные условия для нужных типов
Код:
if (DT.RegData=rdInteger) then                       
      Reg2.WriteInteger(SL[i], Reg.ReadInteger(SL[i]));
     if (DT.RegData=rdString) then
      Reg2.WriteString(SL[i], Reg.ReadString(SL[i]));

Пример использования:

Код:
Try
    RegCopy('\SOFTWARE\YourKey');   //при необходимости подрекдактировать
Except
end;

Последний раз редактировалось {Shadowevil}; 08.08.2012 в 14:56.
{Shadowevil} вне форума Ответить с цитированием
Старый 08.08.2012, 16:18   #6
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Цитата:
Сообщение от {Shadowevil} Посмотреть сообщение
Посмотрел, а толку? Редактировать модуль не очень хочется, а заимствовать оттуда что-то смысла нет.
Хм, дело Ваше, но по сути TRegistry.MoveKey копирует ветку реестра из старого места в новое, и затем удаляет в старом.
То бишь, Вам можно было бы позаимствовать реализацию MoveKey исключив из неё удаление, и всё. Создать наследника TRegistry и дополнить его необходимыми методами ничего же не мешает?

Но, как говорится "Хозяин - барин".
astecenko вне форума Ответить с цитированием
Старый 09.08.2012, 09:08   #7
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от astecenko Посмотреть сообщение
Хм, дело Ваше, но по сути TRegistry.MoveKey копирует ветку реестра из старого места в новое, и затем удаляет в старом.
То бишь, Вам можно было бы позаимствовать реализацию MoveKey исключив из неё удаление, и всё. Создать наследника TRegistry и дополнить его необходимыми методами ничего же не мешает?

Но, как говорится "Хозяин - барин".
TRegistry.MoveKey удаляет исходный ключ только если поставить в вызове последним аргументом True, а так не удаляет.
Дело в том. что TRegistry.MoveKey не копирует ветки из разных секций ...тобишь ветку из HKLM скопировать в HKCU не получится ....по крайней мере у меня не получалось ну никак.

Поэтому написать процедуру с использованием рекурсии оказалось, на мой взгляд, самым оптимальным решением))
Но за помощь спасибо)
{Shadowevil} вне форума Ответить с цитированием
Старый 11.04.2019, 22:44   #8
nnm4evr
Новичок
Джуниор
 
Регистрация: 08.04.2015
Сообщений: 1
По умолчанию

Цитата:
Сообщение от {Shadowevil} Посмотреть сообщение
if (DT.RegData=rdInteger) then
Reg2.WriteInteger(SL[i], Reg.ReadInteger(SL[i]));
if (DT.RegData=rdString) then
Reg2.WriteString(SL[i], Reg.ReadString(SL[i]));
А как быть с бинарными данными? Пытался разобраться, но пока ни чего не вышло...
nnm4evr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генератор ключей lecko Microsoft Office Excel 2 23.08.2011 17:00
Генерация ключей. lost_khv Помощь студентам 0 24.04.2011 13:54
Требуется программным путём считать несколько ключей с реестра из одного раздела. Air Общие вопросы Delphi 6 11.09.2008 11:33
Удаление ключей и параметров из реестра... Altera Общие вопросы Delphi 1 06.05.2008 20:32
Копирование данных из реестра delphin100 Общие вопросы Delphi 5 06.05.2008 16:36