RegNotifyChangeKeyValue
Оговорюсь сразу - в программировании новичок - многого не знаю.
Прошу помочь со следующей задачей.
Мониторинг ключей регистра - отображать когда и ЧТО изменилось.
люди подсказывают идти через RegNotifyChangeKeyValue.
но оно дает знание о том КОГДА что-то изменилось в определенном ключе.
а как знать что?
кроме приведенного ниже, есть два-три способа, какие придумал(советовали):
Есть путь "regedit /e RegData.reg HKEY_LOCAL_MACHINE\Software\Microsoft\Windows" и дальше парсить ини файл. боюсь будет не быстро.
- есть путь Tregistry.savekey =но на выходе файл в таком формате, что сложно понять как отловить "что не так" в новом варианте. открыт вопрос совместимости версий регедитора на разных виндах
- предлагают еще хуки на апи функции, которые правят реестр(Это меня как-то уж совсем пугает, винда то не чужая - а восстанавливать ее потом долго :)
у меня пока есть такой вариант:
Цитата:
TBranchSave = class//хранилище для ключа на опред момент времени
id:longint;
key_val: TRegKeyInfo;
key:string;
valnam : string;
keynam : string;
valdata:Tstringlist;
procedure getkeyFull;
function whatChanged(a:TBranchSave):string;
constructor create(Pkey:string);
end;
procedure TBranchSave.getkeyFull;
var
r:TRegistry;
l:tstringlist;
i:integer;
datinf:TRegDataInfo;
begin
r := TRegistry.Create;
try
r.RootKey := HKEY_LOCAL_MACHINE;
if r.OpenKeyReadOnly(key) then
begin
r.GetKeyInfo(key_val);//беру информацию по ключу
if key_val.NumSubKeys>0 then //беру суб.ключи
begin
l:=tstringlist.Create;
try
r.GetKeyNames(l);
l.Delimiter:='/';
keynam := l.DelimitedText;
finally
l.Free;
end;
end
else
keynam := '';
if key_val.NumValues > 0 then //беру переменные
begin
l := tstringlist.Create;
valdata := tstringlist.Create;
try
r.GetValueNames(l);
l.Delimiter:='/';
valnam := l.DelimitedText;
for i:=0 to l.count-1 do
begin
r.GetDataInfo(l,datinf);
case datinf.RegData of //смотрю по типу данных - ориентация на программы (стринг) - но остальное тоже охота знать. - пишу по минимуму
rdString,rdExpandString : valdata.Add(DT_STRING + r.ReadString(l));
rdInteger : valdata.Add(DT_INTEGER + inttostr(r.ReadInteger(l)));
rdBinary : valdata.Add(DT_BINARY + inttostr(datinf.DataSize));
else valdata.Add(DT_UNKNOWN + inttostr(datinf.DataSize));
end;
end;
finally
l.Free;
end;
end else valnam := '';
end;
finally
r.Free;
end;
end;
но по замечаниям, он "не очень".
буду благодарен за подсказки, ссылки на статьи.
про существование программы "Process Monitor" (RegMon) знаю, но смысл в том, чтоб решить это силами дэльфи.
ЧТО НУЖНО:
- как дешифровать файл Tregistry.Savekey(чтоб вытащить какие изменения 1-го и 2-го бэкапов ключа);
- можно ли через АПИ или еще как, кроме банального экспорта с вызовом регэдитора выгрузить ветвь(интересно не все полностью - только до субключей:добавлен/удален/переименован субключ;как изменилась переменная/значение);
- есть ли какие еще пути решения (желательно названия функций, если через АПИ, или ссылки где про это написано)
SetTraceCallback()