AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Fehler beim Auslesen der Registry
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler beim Auslesen der Registry

Offene Frage von "p80286"
Ein Thema von p80286 · begonnen am 13. Okt 2008 · letzter Beitrag vom 14. Okt 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

Fehler beim Auslesen der Registry

  Alt 13. Okt 2008, 10:29
Hallo zusammen,

ich habe ein Problem beim Einlesen der Schlüssel aus der Registry.
Delphi-Quellcode:
lll:=tstringlist.create;
ll :=tstringlist.create;
reg.rootkey:=$80000000+2; { HKEY_LOCAL_MACHINE }
if reg.openkeyreadonly('') then begin
  lll:=tstringlist.create;
  reg.getkeynames(lll);
  i:=0;
  repeat
    if reg.openkeyreadonly('\'+lll[i]) then begin
      {-- Unterschlüssel holen -----------------}
      if reg.hassubkeys then begin
        reg.getkeynames(ll);
        if ll.Count>0 then
          for j:=0 to ll.count-1 do
            lll.add(reg.currentpath+'\'+ll[j])
        ll.clear;
      end;
    end;
    inc(i,1);
  until i=lll.count;
end;
Es gibt einige Schlüssel bei denen reg.getkeynames(ll) leere Strings('') zurück liefert, obwohl Schlüssel vorhanden sind. Sie sind zumindestens in regedit sichtbar.
Die Leseberechtigung ist vorhanden.
Betroffen sind z.B.

SYSTEM\ControlSet003\Control\Class\{8ECC055D-047F-11D1-A537-0000F8753ED1}
SYSTEM\ControlSet003\Control\DeviceClasses\{53f563 0a-b6bf-11d0-94f2-00a0c91efb8b}
SYSTEM\ControlSet003\Control\StillImage\Events\STI ProxyEvent
SYSTEM\ControlSet003\Services\Tcpip\Parameters\DNS RegisteredAdapters


gibt es da einen Workaround oder wisst Ihr worin diese Verhalten begründet ist?

Gruß K-H
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Fehler beim Auslesen der Registry

  Alt 13. Okt 2008, 10:45
Hm, kan nich dir jetzt auch nicht sagen. Aber was anderes kann ich dir sagen "l" als Variablenname zu nehmen ist nicht gerade optimal. Zum einem kann es als eins gelsen werden oder als kleines "ell". Und wenn dann so was gemacht wird:
lll wird es irgendwie ganz ecklig. Ist das jetzt ell-ell-eins oder ell-eins-ell oder...?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Fehler beim Auslesen der Registry

  Alt 13. Okt 2008, 10:46
Hallo,

nix für Ungut, aber was machst Du da?
lll:=tstringlist.create; gibt es zweimal.
Du lädst die Schlüssel nach lll, durchläufst lll anschließend in einer Schleife und hängst in dieser Schleife weitere Einträge an lll, die ggfls. zu weiteren Einträgen in lll führen, d. H.: Du durchläufst die entsprechenden Zweige der Registry quasi "fast rekursiv". Okay, wenn man sich den Zweig in der Registry anschaut, mag das durchaus so sinnvoll sein.

Dort, wo in RegEdit (Standard) steht, sind meines Wissens keine Schlüsselnamen vorhanden, stolperst Du darüber?
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Fehler beim Auslesen der Registry

  Alt 13. Okt 2008, 10:52
Edith sagt: So einen Blödsinn lösch ich lieber....

Damit ich nicht ganz blöd da stehe sag ich mal:
inc(i,1); = inc(i);

Sherlock
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Fehler beim Auslesen der Registry

  Alt 13. Okt 2008, 11:27
Hallo,
vielen Dank für die schnellen Reaktionen.
1) ll hab ich mir für "lokale" Stringlisten angewöhnt. falls ich eine weitere benötige wird lll daraus. Ist wohl nicht optimal meine "lokallist".

2) inc(i,1); ist meiner Meinung ganz klar besser als inc(i), da ich explicit angebe um wieviel i erhöht werden soll. Wahrscheinlich wird auch in 10 Jahren inc(i) = inc(i,1) = i:=i+1 sein, aber in Schleifen hab ich mir inc(i,x) angewöhnt.

3) Dieses "recursive" Auslesen muß für meine Zwecke sein. Die "überflüssigen" Werte fliegen teilweise schon beim Einlesen heraus, den Teil des Codes habe ich aber gelöscht, da nicht relevant.

4) Nein, ich meine nicht (Standard) es sind ganz klar Schlüsselnamen zu sehen.

Gruß K-H
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

Re: Fehler beim Auslesen der Registry

  Alt 13. Okt 2008, 12:17
Hallo,

habe mal ein bisserl gedaddelt und hatte ursprünglich das gleiche Ergebnis wie Du.
Habe den Quelltext daher mal verändert:
Delphi-Quellcode:
lll:=tstringlist.create;
ll :=tstringlist.create;
reg := TRegistry.Create;
reg2 := TRegistry.Create;
reg.rootkey:=$80000000+2; { HKEY_LOCAL_MACHINE }
reg2.rootkey:=$80000000+2; { HKEY_LOCAL_MACHINE }
sKey := 'SYSTEM\ControlSet003\Control\DeviceClasses\{53f5630a-b6bf-11d0-94f2-00a0c91efb8b}';
if reg.openkeyreadonly(sKey) then begin
  reg.getkeynames(lll);
  i:=0;
  repeat
    if reg2.openkey(sKey + '\' + lll[i],false) then begin
      {-- Unterschlüssel holen -----------------}
      if reg2.hassubkeys then begin
        reg2.getkeynames(ll);
        if ll.Count>0 then
          for j:=0 to ll.count-1 do
            lll.add(reg2.currentpath+'\'+ll[j]);
        ll.clear;
      end;
      reg2.CloseKey;
    end;
    inc(i,1);
  until i=lll.count;
end;
Damit scheine ich in jeden Unterschlüssel hineinzukommen, hilft Dir das?

Sauber ist es nicht, zuweilen überschreitet das irgendwo einen Listenindex.
Was mich wundert: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\St illImage\Debug bekomme ich nicht zu sehen. Hier vermute ich mal, dass da ein Rechteproblem vorliegen könnte. Nachdem ich bei diesem Zweig Jeder Zugriff gegeben habe, komme ich zwar nicht in den Zweig hinein, aber die obige Routine geht "wenigstens in eine Endlosschleife".
Nach 'nem Neustart des Programmes werden auch die Schlüssel unterhalb von Debug angezeigt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Fehler beim Auslesen der Registry

  Alt 13. Okt 2008, 12:27
Sagt mal, warum nehmt ihr nicht die Konstanten für HKLM, sondern die nummerischen Werte? Nehmt die Konstante und ihr könnt euch den Komemntar sparen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

Re: Fehler beim Auslesen der Registry

  Alt 13. Okt 2008, 13:07
Hallo Luckie,
Zitat von Luckie:
Sagt mal, warum nehmt ihr nicht die Konstanten für HKLM, sondern die nummerischen Werte? Nehmt die Konstante und ihr könnt euch den Komemntar sparen.
normalerweise nehme ich die Konstanten, aber hier ist's halt Vererbung durch Copy&Paste
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Fehler beim Auslesen der Registry

  Alt 14. Okt 2008, 10:44
Hallo Stephan,

tut mir leid, das ich mich erst so spät melde.
Ich hab's mal mit Deiner Methode gemacht aber das Verhalten war genau das gleiche (aber auf unterschiedlichen Rechnern mit unterschiedlichen "Aussetzern").

Ich hab die Registry.pas von Delphi5 mal "kanibalisiert" und versucht die Angelegenheit zu debuggen.
Das Problem ist wohl, das in RegKeyInfo falsche Daten stehen, und zwar wird die Anzahl der Subkeys wohl richtig erkannt/übergeben, aber bei

MaxSubKeyLen,
NumValues,
MaxValueLen,
MaxDataLen

wird nur 0 übergeben. Dann ist es auch kein Wunder, das es hakt.
Mal sehen ob ich die Ursache finde.

Gruß K-H
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

Re: Fehler beim Auslesen der Registry

  Alt 14. Okt 2008, 11:24
Hallo,
Zitat von p80286:
Mal sehen ob ich die Ursache finde.
bin mir da inzwischen ziemlich Sicher, dass Du ein Rechteproblem hast. Wenn Du mit RegEdit Rechte auf die Zweige vergibst, so bekommt Delphi diese auch zu sehen und kann die Daten abfragen. Die Frage ist daher eher, wie kannst Du im Quelltext auch bei mangelnden Rechten zugreifen, bzw. wie kannst Du im Programm Deinem Registryzugriff höhere Rechte verschaffen.

Schau doch mal hier http://entwickler-forum.de/showthread.php?t=15200 oder hier regkeywithfullaccess oder hier how to access the registry using windows api

Eventuell hilft Dir aber auch dieses aus der Delphihilfe weiter:
Delphi-Quellcode:
Der Konstruktor erzeugt ein TRegistry-Objekt.

Delphi-Syntax:

constructor Create; overload;
constructor Create(AAccess:LongWord); overload; // <-- unter "Siehe auch" gibt es eine Liste der möglichen Werte
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 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