
05.01.2013, 22:33
|
Новичок
|
|
Регистрация: 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... А самое парадоксальное - презентация состоялась в Минске...
|