Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Registrierung rekursiv durchsuchen, warum zugriffsverletzung (https://www.delphipraxis.net/17933-registrierung-rekursiv-durchsuchen-warum-zugriffsverletzung.html)

mumu 11. Mär 2004 17:45


Registrierung rekursiv durchsuchen, warum zugriffsverletzung
 
jedesmal wenn ich diese procedure aufruf, dann erhalte ich nach einiger zeit eine zugriffsverletzung. woran kann das liegen? hat jemand ne idee?

Delphi-Quellcode:
Procedure Registry_durchsuchen(Schluessel, suchen: string);
var i, a: integer;
 regkeys: tstringlist;
 regvalues: tstringlist;
 wert: string;
 value: string;
begin
//if pos(uppercase('\System\ControlSet'), uppercase(schluessel)) <> 1 then
//begin
  if reg.OpenKey(Schluessel, False) then
  begin
    regkeys := tstringlist.Create;
    try
      reg.Access := KEY_EXECUTE;
      reg.GetKeyNames(regkeys);
      for i:=0 to regkeys.count-1 do
      begin
        regvalues := tstringlist.create;
        try
          if reg.OpenKey(IncludeTrailingBackslash(Schluessel)+regkeys.Strings[i], False) then
          begin
            reg.GetValueNames(regvalues);
            for a:=0 to regvalues.count-1 do
            begin
              if reg.GetDataType(regvalues.Strings[a]) = rdString then
              begin
                value := reg.ReadString(regvalues.Strings[a]);
                if pos(suchen, value) <> 0 then
                begin
                  form1.listbox1.items.Add(IncludeTrailingBackslash(Schluessel)+IncludeTrailingBackslash(regkeys.Strings[i])+'|'+regvalues.strings[a]);
                  application.ProcessMessages;
                end;
              end;
            end;
          end;
        finally
          regvalues.Free;
        end;
        wert := IncludeTrailingBackslash(Schluessel)+regkeys.Strings[i];
        registry_durchsuchen(wert, suchen);
      end;
    finally
      regkeys.Free;
    end;
  end;
//end;
end;
wenn ich jedoch, die zeilen am anfang mit rein nehm, dann funktioniert das ganze problemlos. es muss also irgendwas mit den ordnern
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002
usw...
zu tun haben.

hat jemand eine idee?

mumu 11. Mär 2004 22:45

Re: Registrierung rekursiv durchsuchen, warum zugriffsverlet
 
das ganze ruf ich dann so auf:

reg.rootkey := HKEY_LOCAL_MACHINE;
Registry_durchsuchen('', 'test);

himitsu 11. Mär 2004 22:54

Re: Registrierung rekursiv durchsuchen, warum zugriffsverlet
 
Code:
Procedure Registry_durchsuchen(Schluessel, suchen: string);
var i, a: integer;
 regkeys: tstringlist;
 regvalues: tstringlist;
 wert: string;
 value: string;
begin
//if pos(uppercase('\System\ControlSet'), uppercase(schluessel)) <> 1 then
//begin
  if reg.OpenKey(Schluessel, False) then
  begin
    regkeys := tstringlist.Create;
    try
      reg.Access := KEY_EXECUTE;
      reg.GetKeyNames(regkeys);
      for i:=0 to regkeys.count-1 do
      begin
        regvalues := tstringlist.create;
        try
          if reg.OpenKey(IncludeTrailingBackslash(Schluessel)+regkeys.Strings[i], False) then
          begin
            reg.GetValueNames(regvalues);
            for a:=0 to regvalues.count-1 do
            begin
              if reg.GetDataType(regvalues.Strings[a]) = rdString then
              begin
                value := reg.ReadString(regvalues.Strings[a]);
                if pos(suchen, value) <> 0 then
                begin
                  form1.listbox1.items.Add(IncludeTrailingBackslash(Schluessel)+IncludeTrailingBackslash(regkeys.Strings[i])+'|'+regvalues.strings[a]);
                  application.ProcessMessages;
                end;
              end;
            end;
          end;
        finally
          regvalues.Free;
        end;
        [color=red]if (regkeys.Count > i) and (regkeys.Strings[i] > '') then
        begin[/color]
          wert := IncludeTrailingBackslash(Schluessel)+regkeys.Strings[i];
          registry_durchsuchen(wert, suchen);
        [color=red]end;[/color]
      end;
    finally
      regkeys.Free;
    end;
  end;
//end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz