Вот тебе примерный алгоритм(при помощи рекурсии), но его необходимо пересматривать(я бы посмотрел, но у меня сейчас нет времени), т.к. при длительном поиске возникает ошибка с выпаданием в CPU - Access Violetion (сначала все данные нормально находятся), а в асме я пока не силен - тут только p0s0l может ответить быстро ) И его нужно по идее еще оптимизировать, т.к. при очередном вызове функции происходит создание новых экземпляров классов, а при большой вложенности это может негавивно сказаться, особенно если у компа мало памяти(может даже из за этого ошибка и возникает)
Вот код:
| Код | uses ...Registry; type TRegFindType = (rftUseCase, rftEntryInValue); TRegFindTypes = set of TRegFindType;
procedure FindValsInReg(const Value: string; Key: string; FindList: TStrings; Root: HKEY; Flags: TRegFindTypes); var Reg: TRegistry; KeyNames, ValueNames: TStringList; i, j: integer; ReadedString: string; begin try Reg:= TRegistry.Create; ValueNames:= TStringList.Create; KeyNames:= TStringList.Create; with Reg do begin RootKey:= Root; if OpenKeyReadOnly(Key) then begin GetKeyNames(KeyNames); for i:= 0 to KeyNames.Count - 1 do begin Application.ProcessMessages; if OpenKeyReadOnly(Key + '\' + KeyNames[i]) then begin GetValueNames(ValueNames); for j:= 0 to ValueNames.Count - 1 do begin Application.ProcessMessages; if GetDataType(ValueNames[j]) = rdString then begin ReadedString:= ReadString(ValueNames[j]); if rftUseCase in Flags then begin if rftEntryInValue in Flags then if Pos(Value, ReadedString) <> 0 then FindList.Add(Format('EntryInValue: Key - %s, FindedVal - %s, Value - %s', [Key + '\' + KeyNames[i], ReadedString, Value])) else if AnsiStrComp(PAnsiChar(ReadedString), PAnsiChar(Value)) = 0 then FindList.Add(Format('FullValue: Key - %s, FindedVal - %s, Value - %s', [Key + '\' + KeyNames[i], ReadedString, Value])); end else begin if rftEntryInValue in Flags then if Pos(AnsiUpperCase(Value), AnsiUpperCase(ReadedString)) <> 0 then FindList.Add(Format('EntryInValue: Key - %s, FindedVal - %s,Value - %s', [Key + '\' + KeyNames[i], ReadedString, Value])) else if AnsiCompareStr(ReadedString, Value) = 0 then FindList.Add(Format('FullValue: Key - %s, FindedVal - %s, Value - %s', [Key + '\' + KeyNames[i], ReadedString, Value])); end; end; end; CloseKey; FindValsInReg(Value, Key + '\' + KeyNames[i], FindList, Root, Flags); end; end; CloseKey; end; end; finally FreeAndNil(ValueNames); FreeAndNil(KeyNames); FreeAndNil(Reg); end; end;
|
Пример вызова:
| Код | procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption:= 'Идет поиск'; FindValsInReg('SomeValue', '',ListBox1.Items, HKEY_LOCAL_MACHINE, [rftEntryInValue, rftUseCase]); Label1.Caption:= 'Поиск закончен'; end; | |