Показать сообщение отдельно
  #2  
Старый 05.01.2013, 22:33
UFO 007 UFO 007 вне форума
Новичок
 
Регистрация: 28.11.2010
Сообщения: 54
Репутация: 10
По умолчанию

Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Graphics, Dialogs, StdCtrls, Registry;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

CurDir: string;
KeyCount, Found, NotFound: integer;
Reg, Reg64: TRegistry;

implementation

{$R *.lfm}

{ TForm1 }


procedure TForm1.Button1Click(Sender: TObject);
procedure RegScan(Key, Search: string);
var
  tskey, tsval: TStrings;
  i,j: integer;
begin//1     
  inc(KeyCount);
  Edit2.Text:= 'KeyCount= '+inttostr(KeyCount);
  application.ProcessMessages;
  tskey:= TStringList.Create;
  tsval:= TStringList.Create;
  If Not Reg64.OpenKey(key, false)Then
  begin//2 if
Memo3.Lines.Add('нет такого ключа '+ key);
    If Reg.OpenKey(key, false)// .aif
    Then //если существ (открылся) имя = ''
    begin//3
      reg.GetKeyNames(tskey);//из ''->[0]=*;[1]=.386;[2]=.7z;[3]=.aca;...
      reg.GetValueNames(tsval);//получаем и
      for j:= 0 to tsval.Count - 1 do //просматриваем все параметры
      begin//4 j
        if Reg.GetDataType(tsval.Strings[j]) in [rdString, rdExpandString] then
        If (Pos(Search, tsval.Strings[j]) > 0) Or
        (Pos(Search, Reg.ReadString(tsval.Strings[j])) > 0)
        Then
        begin//5 if
          Inc(found);
Memo2.Lines.Add(inttostr(KeyCount)+'j= '+Reg.ReadString(tsval.Strings[j]));
Memo1.Lines.Add(inttostr(KeyCount)+'key= '+key);
Edit1.Text:= inttostr(found);
        end;//5 if
      end;//4 j  все парамктры проверены
    end Else//3 если не существ Reg32 = ''
Memo3.Lines.Add('и 32-ого тоже '+ key);
    Reg.CloseKey;
    tsval.Clear;
    for i:= 0 to tskey.Count - 1 do
    begin//3 i
      Reg.OpenKey(tskey.Strings[i], false);
      reg.GetValueNames(tsval);//получаем и
      Reg.CloseKey;
      for j:= 0 to tsval.Count - 1 do //просматриваем все параметры
      begin//4 j
        if Reg.GetDataType(tsval.Strings[j]) in [rdString, rdExpandString] then
        If Pos(Search, Reg.ReadString(tsval.Strings[j])) > 0 Then
        begin//5 if
          Inc(found);
Memo2.Lines.Add(inttostr(KeyCount)+'i= '+Reg.ReadString(tsval.Strings[j]));
Memo2.Lines.Add('');
Memo1.Lines.Add(inttostr(KeyCount)+tskey.Strings[i]);
Edit1.Text:= inttostr(found);
        end;//5  if
      end;//4 j
Edit1.Text:= inttostr(found);
      RegScan(Key + '\' + tskey.Strings[i], Search);
    end;//3 i
Inc(NotFound);
Edit3.Text:=inttostr(NotFound);
  end//2 if
  Else
  begin//2
      reg64.GetKeyNames(tskey);//1-open... 2-open... 3-persyst...
      reg64.GetValueNames(tsval);
      for j:= 0 to tsval.Count - 1 do
      begin//3 j
        if Reg64.GetDataType(tsval.Strings[j]) in [rdString, rdExpandString] then
        If (Pos(Search, tsval.Strings[j]) > 0) Or
        (Pos(Search, Reg64.ReadString(tsval.Strings[j])) > 0)
        Then
        begin//4 if
          Inc(found);
  Memo2.Lines.Add(inttostr(KeyCount)+'j= '+Reg64.ReadString(tsval.Strings[j]));
  Memo1.Lines.Add(inttostr(KeyCount)+'key= '+key);
  Edit1.Text:= inttostr(found);
        end;//4 if
      end;//3 j
      Reg64.CloseKey;
      tsval.Clear;
      for i:= 0 to tskey.Count - 1 do
      begin//3 i
        Reg64.OpenKey(tskey.Strings[i], false);
        reg64.GetValueNames(tsval);
        Reg64.CloseKey;
        for j:= 0 to tsval.Count - 1 do
        begin//4 j
          if Reg64.GetDataType(tsval.Strings[j]) in [rdString, rdExpandString] then
          If Pos(Search, Reg64.ReadString(tsval.Strings[j])) > 0 Then
          begin//5 if
            Inc(found);
  Memo2.Lines.Add(inttostr(KeyCount)+'i= '+Reg64.ReadString(tsval.Strings[j]));
  Memo2.Lines.Add('');
  Memo1.Lines.Add(inttostr(KeyCount)+tskey.Strings[i]);
  Edit1.Text:= inttostr(found);
          end;//5 if
        end;//4 j
  Edit1.Text:= inttostr(found);
    RegScan(Key + '\' + tskey.Strings[i], Search);
      end;//3 i
    end;//2 i
//Memo2.Lines.Add(inttostr(tsval.Count));
//Memo1.Lines.Add(ts[5]);
end;//1 RegScan

begin
  reg64.RootKey:= HKEY_CLASSES_ROOT;
  RegScan('', 'C:\Documents and Settings');
{  RegScan(
   'Installer\Products\4EA42A62D9304AC4784BF238120683FF', 'C:\Documents and Settings');
}   reg.RootKey:= HKEY_CURRENT_USER;
   RegScan('', 'C:\Documents and Settings');
   reg.RootKey:= HKEY_LOCAL_MACHINE;
   RegScan('', 'C:\Documents and Settings');
   reg.RootKey:= HKEY_USERS;
   RegScan('', 'C:\Documents and Settings');
   reg.RootKey:= HKEY_CURRENT_CONFIG;
   RegScan('', 'C:\Documents and Settings');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Application.Title:= 'UFO'+'''s To SSD Optimizator';
  CurDir:= ExtractFilePath(Application.ExeName);
  Reg:= TRegistry.Create(KEY_ALL_ACCESS);
  Reg64:= TRegistry.Create(KEY_ALL_ACCESS OR $0100);
  memo1.Clear;
  memo2.Clear;

end;

end.
обнаруживает 180 значений (а мож это ещё не все - как узнать?) по сравнению с 85-ю (от движка RegistryCheckerа на Рег(х32)) KeyCount Лазаря составил 811980 ключей и параметров (в среднем по 2 с копеечками Кб текста на значение) из которых 2265 не найдено. Тут значение например "\Wow6432Node\Wow6432Node\TypeLib\{D27CDB6B-AE6D-11CF-96B8-444553540000}" и пресловутый РегЕдит не найдёт... Вот тут (когда бубен совсем порвался - отдыхает) и вырастает ВОПРОС № ДВА (мож даже серия): откуда на вход RegScan попадают такие "ключи"? и как узнать точна ли цифра 811980 (это фактическое кол-во ключей и параметров в реестре? мож их там больше (или мерьше)?).

Заранее благодарен за любую подсказку (для апонятья).

(Есть подозрение, что вопрос не совсем по адресу и мож следует обратиться к спецам ИМЕННО по Винде типа ОСьЗона.нет и проплагиатить этот материал там, но боюсь, что тамошние Гуру на Паскале "... ни в дугу и ни в тую...")
__________________
...И был сначала ZX-Spectrum, а потом его T(urbo)ASS(e)M(bler)... И только на 7-й день (когда Интел купила Пентковского [из КБ Бабаяна]) - появился Pentium-I... А в Союзе P-II был ещё в 1978 году (точнее: Эльбрус [мультискалярный проц] только не рапространялся спекулянтами, а управлял ракетами и спутниками)... А лет с пяток назад Эльбрус-II ПЁР (но никак не ГНАЛСЯ как Селероны) на F(recuency):= 400 GHz... А самое парадоксальное - презентация состоялась в Минске...
Ответить с цитированием