Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Чтение из реестра по списку путей


Автор: alligator 20.9.2008, 20:43
Один путь как прочитать я разобрался делаю чтение посредством tregistry, на экран результат вывожу с помощью listview и tstringlist.

Есть несколько путей заранее известных около 20 например:
Hklm\1\2\3
Hklm\2\5\8
Hkcu\1\2\3
Как выше я написал из одного считать не проблема а как прочитать из других путей и результаты добавить в tstringlist
Подскажите пожалуйста.

Автор: Данкинг 20.9.2008, 20:47
А в чём проблема, если пути заранее известны?

Автор: alligator 20.9.2008, 21:02
Я пару дней работаю с дельфи, а так в основном с пхп, потихоньку изучаю делфи. Пока тяжело разбираться, подскажите smile 

Автор: Данкинг 20.9.2008, 21:05
Ну дык, читаешь-то как? Пример в студию!

Автор: alligator 20.9.2008, 21:26
Код

procedure TForm1.Button1Click(Sender: TObject);
var
Reg: TRegistry;
  S: TStringList;
  i: Integer;
  Path: string;

begin
Path := 'SYSTEM\CurrentControlSet\Enum\USB';
Reg:= TRegistry.Create;  S:= TStringList.Create;
Reg.RootKey :=HKEY_LOCAL_MACHINE;
Reg.OpenKeyReadOnly(Path);
Reg.GetKeyNames(S);
Label1.Caption := 'Найдено записей: '+IntToStr(S.Count);
for i := 0 to S.Count - 1 do
begin
Form1.Listview1.AddItem('HKEY_LOCAL_MACHINE\'+Path+'\'+S.Strings[i], Sender);
end;
S.Clear;
Reg.Free;
end;

Автор: Данкинг 20.9.2008, 21:28
Ну так вот меняй HKEY_LOCAL_MACHINE и значение Path на то, что нужно.

Автор: alligator 20.9.2008, 21:44
получается что я избавляюсь от Reg.RootKey :=HKEY_LOCAL_MACHINE;
делаю один path?
потипу path :='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB';
У меня не получается сохранить данные из первого ключа, а когда я считываю следующий то предыдущие полученные данные удаляются =(((

Автор: Данкинг 20.9.2008, 21:45
Цитата(alligator @  20.9.2008,  22:44 Найти цитируемый пост)
У меня не получается сохранить данные из первого ключа, а когда я считываю следующий то предыдущие полученные данные удаляются =((( 

В смысле, куда они могут удалиться из Listview1 ?!

Автор: alligator 20.9.2008, 22:12
Код

begin
Path := 'SYSTEM\CurrentControlSet\Enum\USBSTOR';
Path2 := 'SYSTEM\CurrentControlSet\Enum\USB';
Reg:= TRegistry.Create;  S:= TStringList.Create;
Reg.RootKey :=HKEY_LOCAL_MACHINE;
Reg.OpenKeyReadOnly(Path);
Reg.GetKeyNames(S);
Reg.CloseKey;
Reg.OpenKeyReadOnly(Path2);
Reg.GetKeyNames(S); //на этом месте старые данные удаляются, как сохранить незнаю =((
Label1.Caption := 'Найдено записей: '+IntToStr(S.Count);
for i := 0 to S.Count - 1 do
begin
Form1.Listview1.AddItem(S.Strings[i], Sender);
end;
S.Clear;
Reg.Free;
end;

Автор: Данкинг 20.9.2008, 22:21
Не знаю, как они из Listview могут удаляться, попробуй ListBox обычный вместо него.

Автор: alligator 20.9.2008, 22:37
Код

Reg.OpenKeyReadOnly(Path);
Reg.GetKeyNames(S);
Reg.CloseKey;
Reg.OpenKeyReadOnly(Path2);
Reg.GetKeyNames(Temp);
S.AddStrings(Temp);
Temp.Clear;

Получилось сделать через временную переменную, может можно как нибудь реализовать лучше?
Подскажи а есть функция определения полного пути до ключа или его надо самому восстанавливать, можеть есть пример где можно посмотреть.... ?

Автор: Данкинг 20.9.2008, 22:55
Цитата(alligator @  20.9.2008,  23:37 Найти цитируемый пост)
Получилось сделать через временную переменную, может можно как нибудь реализовать лучше?

Я всё же за вариант с ListBox. smile 

Цитата(alligator @  20.9.2008,  23:37 Найти цитируемый пост)
Подскажи а есть функция определения полного пути до ключа или его надо самому восстанавливать, можеть есть пример где можно посмотреть.... ? 

Не знаю... Попробуй в DRKB поискать...

Автор: BaD_SeCt0R 21.9.2008, 03:31
Цитата(alligator @  20.9.2008,  21:26 Найти цитируемый пост)
Код

procedure TForm1.Button1Click(Sender: TObject);varReg: TRegistry;  S: TStringList;  i: Integer;  Path: string;beginPath := 'SYSTEM\CurrentControlSet\Enum\USB';Reg:= TRegistry.Create;  S:= TStringList.Create;Reg.RootKey :=HKEY_LOCAL_MACHINE;Reg.OpenKeyReadOnly(Path);Reg.GetKeyNames(S);Label1.Caption := 'Найдено записей: '+IntToStr(S.Count);for i := 0 to S.Count - 1 dobeginForm1.Listview1.AddItem('HKEY_LOCAL_MACHINE\'+Path+'\'+S.Strings[i], Sender);end;S.Clear;Reg.Free;end;

Ниче нигде не удаляется, зачем дебагер существует? ;)

Если с листвью (согласен с Данкинг'ом - непонятно зачем), то уже так тогда
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
  S: TStringList;
  i: Integer;
  Path: string;
begin
  Path := 'SYSTEM\CurrentControlSet\Enum\USBSTOR';
  Reg:= TRegistry.Create;  S:= TStringList.Create;
  Reg.RootKey :=HKEY_LOCAL_MACHINE;
  Reg.OpenKeyReadOnly(Path);
  Reg.GetKeyNames(S); //ниче здесь не удаляется :)
  Reg.CloseKey;

  if S.Count=0 then Exit; //бывает...
  ListView1.Clear;
  for i:=0 to S.Count-1 do
    begin
      ListView1.Items.Add;
      ListView1.Items.Item[i].Caption:=S.Strings[i];
    end;

  S.Free; //Clear только строчки очищает, объект убить надо :)
  Reg.Free;
end;


Добавлено через 11 минут и 46 секунд
Цитата(alligator @  20.9.2008,  22:37 Найти цитируемый пост)
функция определения полного пути до ключа или его надо самому восстанавливать

а это как? чего-то не понял...

Автор: alligator 21.9.2008, 07:50
Это для одного пути, а путей то будет несколько... Listview не обязательно, я вообще хочу сделать удаление ключей выборочно, выделяешь строку в программе и по нажатию на delete удаляешь ключ из реестра, как это реализовать незнаю поэтому и использую listview

Автор: BaD_SeCt0R 21.9.2008, 11:33
alligator, по порядку. С чем конкретно сложности?

Добавлено через 2 минуты и 42 секунды
И как ты хочешь это реализовать? Это дерево будет? Как в regedit'е? Или просто список путей?

Автор: alligator 21.9.2008, 13:53
Список путей просто будет, а удалять хочу сделать по нажатии на delete
 Хочу реализовать программу для удаления ключей реестра из заранее извесных путей, а интерфейс у программы потипу autoruns от sysinternals.com

Автор: BaD_SeCt0R 21.9.2008, 14:46
1. Кинь на форму лисбокс
2. Выстави MultiSelect в true
3. Создай обработчик типа
Код

procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Reg: TRegistry;
  S: TStringList;
  Path: string;
  i:integer;
begin
  Path := 'Software';

  if Key = vk_DELETE then
    begin
     if ListBox1.Count = 0 then exit;
     Reg:= TRegistry.Create;
     for i:=0 to ListBox1.Count-1 do
      if ListBox1.Selected[i] then
       begin
         Reg.RootKey :=HKEY_LOCAL_MACHINE;
         Reg.DeleteKey(Path+'\'+ListBox1.Items.Strings[i]);
       end;
     ListBox1.DeleteSelected;
     Reg.Free;
    end;

  if Key = vk_F5 then
    begin
      Reg:= TRegistry.Create;
      S:= TStringList.Create;
      Reg.RootKey :=HKEY_LOCAL_MACHINE;
      Reg.OpenKeyReadOnly(Path);
      Reg.GetKeyNames(S);
      Reg.CloseKey;

      ListBox1.Items.Assign(S);

      S.Free;
      Reg.Free;
    end;
end;

На F5 - обновляет список, на Delete убивает выделенные пункты.

Добавлено через 1 минуту и 12 секунд
ЗЫ: Path выставляй, какой тебе надо

Автор: alligator 21.9.2008, 15:07
Спасибо буду разбираться!

Автор: alligator 1.10.2008, 03:24
Поковырялся я с программой, реализовал поиск нужных значений, но столкнулся с проблемой что програмно удалить ключ из выше указаных веток не получается только если вручную и то надо ставить права на каждую ветку, подскажите пожалуйста как можно реализовать чтобы програмно можно было удалять необходимые ключи???

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)