Протоколирование изменений в реестре.
1) Протоколирование моментов изменений в заданном разделе реестра, протокол должен формироваться как текстовый файл.
2) Проверка наличия указанных в реестре файлов и каталогов на диске с формированием протокола несоответствий. Протокол должен быть сформирован как текстовый файл.
Заранее спс всем!
1) Протоколирование моментов изменений в заданном разделе реестра, протокол должен формироваться как текстовый файл.
надо писать что-то типа regmon. он мониторит через перехват функций в SDT.
2) Проверка наличия указанных в реестре файлов и каталогов на диске с формированием протокола несоответствий. Протокол должен быть сформирован как текстовый файл.
чего тут сложного? ствндартная функция Delphi - FileExists и DirectoryExists, получаешь имена из реестра и проверяешь существование файлов и папок.
2. тебе понадобится перебирать ключи с помощью соответствующих функций RegEnumXXX
var
MainMemo: TMemo;
begin
Result:=0;
while true do
if RegNotifyChangeKeyValue(HKEY_CURRENT_USER, true, REG_NOTIFY_CHANGE_NAME or REG_NOTIFY_CHANGE_LAST_SET or REG_NOTIFY_CHANGE_ATTRIBUTES or REG_NOTIFY_CHANGE_SECURITY, 0, false)=ERROR_SUCCESS then
begin
MainMemo.Lines.Add('Произошло изменение');
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
thrid: dword;
begin
thrNotify:= CreateThread(nil, 0, @isNotify, nil, 0, thrid);
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
TerminateThread(thrNotify, 0);
end;
[highlight=delphi]
uses
SysUtils, windows;
procedure EnumFunc(kkey: HKEY; ss: string);
var
skey: HKEY;
index, skeyname, svalname, indexv: dword;
keyname, valname: array[0..255]of char;
ptype, spdata, stmp: dword;
pdata, tmp: pointer;
s: string;
begin
index:=0;
GetMem(pdata, 256);
GetMem(tmp, 256);
spdata:=256;
stmp:=256;
indexv:=0;
while RegEnumValue(kkey, indexv, valname, svalname, nil, @ptype, pdata, @spdata)=ERROR_SUCCESS do
begin
if ptype=REG_SZ then
begin
SetLength(s, spdata-1);
CopyMemory(@s[1], pdata, spdata-1);
if pos(':\', s)=2 then
if not fileexists(s) then
writeln('key: ' + ss + ' ; value: ' + s);
end;
inc(indexv);
end;
while RegEnumKey(kkey, index, keyname, skeyname)<>ERROR_NO_MORE_ITEMS do
begin
if RegOpenKey(kkey, keyname, skey)=ERROR_SUCCESS then
begin
ss:=ss+'\';
ss:=ss+keyname;
EnumFunc(skey, ss);
RegCloseKey(skey);
end;
inc(index);
end;
FreeMem(pdata, 256);
FreeMem(tmp, 256)
end;
var
key: HKEY;
begin
if RegOpenKey(HKEY_CURRENT_USER, 'Software\ABBYY', key)=ERROR_SUCCESS then
begin
EnumFunc(key, 'Software\ABBYY\');
RegCloseKey(key);
end;
readln;
end.
[/highlight]
вообщем выводит несоответствия в консоль. как сделать, чтоб в файл - твоя забота(это не страшно).
var
MainMemo: TMemo;
begin
Result:=0;
while true do
if RegNotifyChangeKeyValue(HKEY_CURRENT_USER, true, REG_NOTIFY_CHANGE_NAME or REG_NOTIFY_CHANGE_LAST_SET or REG_NOTIFY_CHANGE_ATTRIBUTES or REG_NOTIFY_CHANGE_SECURITY, 0, false)=ERROR_SUCCESS then
begin
MainMemo.Lines.Add('Произошло изменение');
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
thrid: dword;
begin
thrNotify:= CreateThread(nil, 0, @isNotify, nil, 0, thrid);
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
TerminateThread(thrNotify, 0);
end;
ну как то вот так будет тогда:
[highlight=delphi]
function isNotify(MainMemo:TMemo):dword; stdcall;
begin
Result:=0;
while true do
if RegNotifyChangeKeyValue(HKEY_CURRENT_USER, true, REG_NOTIFY_CHANGE_NAME or REG_NOTIFY_CHANGE_LAST_SET or REG_NOTIFY_CHANGE_ATTRIBUTES or REG_NOTIFY_CHANGE_SECURITY, 0, false)=ERROR_SUCCESS then
begin
MainMemo.Lines.Add('Произошло изменение');
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
thrid: dword;
begin
thrNotify:= CreateThread(nil, 0, @isNotify, pointer(Memo1), 0, thrid);
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
TerminateThread(thrNotify, 0);
end;
[/highlight]
чего у тебя не работает? или без чего? ты вообще пробовал последнее так как я написал в предыдущем посте сделать?
MainMemo.Lines.Add('Произошло изменение'); то на этом месте выкидывает ошибку после компиляции, а на счет 2-го задания, откуда взялись writeln и readln (это же не паскаль, на месте этого тож ошибки выкидывает, пробовал MessageBox туда закидывать все равно чет ошибку выкидывает только после компиляции уже!)
MainMemo.Lines.Add('Произошло изменение'); то на этом месте выкидывает ошибку после компиляции,
показывай код, как ты это сделал, как функцию определил, как вызвал её. только все так как у тебя.
а что в Delphi нет writeln и readln?! ну показывай как MessageBox "вставлял".
елси ошибки выдает, то указывай какие - я не телепат.
тот код, что приведен - это пример, рабочий пример, и то как его адаптировать к своим условиям это твоя задача. или ты хотел методом копипасте ;) если не хочешь хоть немного делать, так это во фриланс тогда тебе надо обращаться.