Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация функции работы с реестром, GetNextPath 
V
    Опции темы
Ak47black
  Дата 10.5.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Здравствуйте.
Нужна помощь, совет или кусок кода.
Вообщем делаю делаю функцию которая берет путь и возвращает следущий по местоположению путь ключа в реестре.
Вот что я сумел сделать

Код


type
  TEntrysArray = array of String;

const
  Roots: array [0..4] of String = ('HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE', 'HKEY_USERS', 'HKEY_CURRENT_CONFIG');

function StringToEntrys(Text: String): TEntrysArray;
begin
  while (Pos('\',Text)<>0) do
  begin
    SetLength(Result,Length(Result)+1);
    Result[Length(Result)-1]:= Copy(Text,1,pos('\',Text)-1);
    Delete(Text,1,pos('\',Text));
  end;
  if Text<>'' then
  begin
    SetLength(Result,Length(Result)+1);
    Result[Length(Result)-1]:= Text;
  end;
end;


function TRegSearch.GetNextPath(Path: String): String;
var
  Entries: TEntrysArray;
  Reg: TRegistry;
  i, e, u: Integer;
  KeyNames: TStringList;
  PathEx: String;
  RecEntries: TEntrysArray;
  RecKey: String;
  procedure FreeObjects;
  begin
    Reg.Free;
    KeyNames.Free;
  end;  
begin
  Entries:= StringToEntrys(Path);
  Reg:= TRegistry.Create;
  KeyNames:= TStringList.Create;
  if Path = '' then
  begin
    Reg.RootKey:= HKEY_CLASSES_ROOT;
    Reg.OpenKey('',false);
    Reg.GetKeyNames(KeyNames);
    Result:= 'HKEY_CLASSES_ROOT'+'\'+KeyNames.Strings[0];
    FreeObjects;
    Exit;
  end
  else
  begin
    if Entries[0]='HKEY_CLASSES_ROOT' then Reg.RootKey:= HKEY_CLASSES_ROOT;
    if Entries[0]='HKEY_CURRENT_USER' then Reg.RootKey:= HKEY_CURRENT_USER;
    if Entries[0]='HKEY_LOCAL_MACHINE' then Reg.RootKey:= HKEY_LOCAL_MACHINE;
    if Entries[0]='HKEY_USERS' then Reg.RootKey:= HKEY_USERS;
    if Entries[0]='HKEY_CURRENT_CONFIG' then Reg.RootKey:= HKEY_CURRENT_CONFIG;
    PathEx:= '';
    for i:=1 to Length(Entries)-1 do
    begin
      PathEx:= PathEx+'\'+Entries[i];
    end;
    Reg.OpenKey(PathEx,False);
    Reg.GetKeyNames(KeyNames);
    if KeyNames.Count <> 0 then
    begin
      Result:= Path+'\'+KeyNames.Strings[0];
      FreeObjects;
      Exit;
    end
    else
    begin
      Reg.CloseKey;
      PathEx:= '';
      for i:=1 to Length(Entries)-2 do
      begin
        PathEx:= PathEx+'\'+Entries[i];
      end;
      
      Reg.OpenKey(PathEx,False);
      Reg.GetKeyNames(KeyNames);
      i:= KeyNames.IndexOf(Entries[Length(Entries)-1]);
      if i<>-1 then
        begin
          if i<KeyNames.Count-1 then
          begin
            Result:= Entries[0]+PathEx+'\'+KeyNames.Strings[i+1];
            FreeObjects;
            Exit;
          end
          else
          begin
         
            for u:= Length(Entries)-3 downto 0 do
            begin
              RecKey:= Entries[u+1];
              PathEx:= '';
              for e:=1 to u do
              begin
                PathEx:= PathEx+'\'+Entries[e];
              end;
              Reg.CloseKey;
              Reg.OpenKey(PathEx,false);
              Reg.GetKeyNames(KeyNames);
              e:= KeyNames.IndexOf(RecKey);
              if e<>-1 then
                if e<KeyNames.Count-1 then
                begin
                  Result:= Entries[0]+PathEx+'\'+KeyNames.Strings[e+1];
                  FreeObjects;
                  Exit;
                end;
            end;

            for e:=0 to Length(Roots)-1 do
            begin
              if Roots[e] = Entries[0] then
              if e<Length(Roots)-1 then
              begin
                Result:= GetNextPath(Roots[e+1]);
                FreeObjects;
                Exit;
              end;
            end;

          end;
        end;
    end;

  end;
  Result:= '';
  Reg.Free;
  KeyNames.Free;
end;

Проблема в том что очень маленькая скорость 60msc примерно и что-бы перебрать весь реестр требуется очень много времени :(
PM MAIL   Вверх
MetalFan
Дата 10.5.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



тестовый пример давай!
1) ЗАЧЕМ огород с StringToEntrys если есть TStringList.Delimiter и DelimitedText
2) зачем пересоздание TRegistry каждый раз...
3) и т.п.



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ak47black
Дата 10.5.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Вотс сорри за задержку.


Это сообщение отредактировал(а) Ak47black - 10.5.2007, 15:24

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  RegSearch.rar 14,71 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0732 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.