![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Помогите пожалуйста, уже не знаю что делать
![]() Надо найти в выбранных чекбоксами разделах ключи, в значении у которых прописан адрес файла или каталога и проверить его наличие на диске. Если его не существует, то надо вывести ключ в список. Сразу при вызове процедуры ScanKey появляется ошибка. (я ставил красную точку ![]() ![]() First chance exception at $755DB9BC. Exception class EAccessViolation with message 'Access violation at address 00444002 in module 'Project1.exe'. Read of address 00000008'. Process Project1.exe (4776) Код:
procedure TForm1.Button3Click(Sender: TObject); begin try if cbHKEY_CLASSES_ROOT.Checked then begin FReg.RootKey := HKEY_CLASSES_ROOT; ScanKey(''); end; if cbHKEY_CURRENT_USER.Checked then begin FReg.RootKey := HKEY_CURRENT_USER; ScanKey(''); end; if cbHKEY_LOCAL_MACHINE.Checked then begin FReg.RootKey := HKEY_LOCAL_MACHINE; ScanKey(''); end; if cbHKEY_USERS.Checked then begin FReg.RootKey := HKEY_USERS; ScanKey(''); end; if cbHKEY_CURRENT_CONFIG.Checked then begin FReg.RootKey := HKEY_CURRENT_CONFIG; ScanKey(''); end; finally end; end; procedure TForm1.PrintKey(const AKey, AValue, AData: String); var Find: Integer; p: string; begin if FReg.GetDataType(AValue)= rdString then p:= 'REG_SZ (STRING)'; if FReg.GetDataType(AValue)= rdExpandString then p:= 'REG_EXPAND_SZ (ExpandString)'; // Application.ProcessMessages; with ListView3.Items.Add do begin Caption := AKey; SubItems.Add(p); SubItems.Add(AData); end; end; procedure TForm1.ScanKey(Key: String); var S: TStringList; I: Integer; Stmp:string; exist:boolean; begin exist:=true; if FReg.OpenKeyReadOnly(Key) then try S := TStringList.Create; try FReg.GetValueNames(S); for I := 0 to S.Count - 1 do if (FReg.GetDataType(S.Strings[i]) in [rdString, rdExpandString]) and (copy(FReg.ReadString(S.Strings[i]),2,2)=':\') then begin try exist:=fileexists(FReg.ReadString(S.Strings[i])) except exist:=DirectoryExists(FReg.ReadString(S.Strings[i])); end; if not exist then PrintKey(Key, S.Strings[i], FReg.ReadString(S.Strings[i])); exist:=true; end; S.Clear; FReg.GetKeyNames(S); for I := 0 to S.Count - 1 do if S.Strings[i] <> '' then ScanKey(Key + '\' + S.Strings[i]); finally S.Free; end; finally FReg.CloseKey; end; end; Последний раз редактировалось Admin, 26.12.2011 в 22:27. |