![]() |
(TRegistry) Sinn von CurrentKey
Hallöle,
ich verwende TRegistry. Wenn ich RootKey auf einen gültigen Wert setze und den Schlüssel mit OpenKey öffne, so bekommt CurrentKey den selben Wert - ok. Wenn ich aber einen RegPath angebe, d.h. unter dem RootKey einen weiteren Schlüssel öffne (z.B. HKEY_CURRENT_USER\AppEvents), dann besitzt CurrentKey irgendeinen Zahlenwert. Schließe ich den Schlüssel und öffne ihn direkt danach erneut, so ist der Zahlenwert (meist?) ein anderer. Was soll dieser Wert bedeuten? Was sagt er mir? Caps |
AW: (TRegistry) Sinn von CurrentKey
|
AW: (TRegistry) Sinn von CurrentKey
:gruebel:
Zitat:
|
AW: (TRegistry) Sinn von CurrentKey
Zitat:
lg Caps |
AW: (TRegistry) Sinn von CurrentKey
CurrentKey ist vom Typ HKEY, welcher wiederum ein Handle und somit eine Zahl ist. Für die RootKeys sind Konstanten definiert, die der Compiler anscheinend auflösen kann, was bei Unterschlüsseln nicht möglich ist.
|
AW: (TRegistry) Sinn von CurrentKey
Ok, dann kann ich den Wert von CurrentKey eigentlich nicht verwenden (wofür auch...?), zumal beim zweimaligen Öffnen ein und desselben Schlüssels verschiedene Werte für CurrentKey zurückkamen... :gruebel:
Die Beschreibung von RootKey ist auch eher wunderlich als deutlich: Zitat:
Ich benutze weder LoadKey noch RegistryConnect und setze RootKey dennoch auf verschiedene Werte, damit ich halt-eben-nunmal auf diese Stellen zugreifen kann, oder verstehe ich hier was falsch? RootKey ist doch der einzige Weg, dem Registry-Objekt mitzuteilen, dass man in einen bestimmten Root-Schlüssel einsteigen möchte. Eine andere Möglichkeit existiert doch gar nicht, oder? :freak: Verwirrt, Caps |
AW: (TRegistry) Sinn von CurrentKey
Also wenn es ein HKEY (ein Handle) ist, ist weniger verwunderlich, dass unterschiedliche Zahlen beim auf-, zu- und wieder aufmachen rauskommen, oder?
|
AW: (TRegistry) Sinn von CurrentKey
Zitat:
Das soll einer verstehen... ich geh jetzt heim. Schönen Abend! :-) lg Caps |
AW: (TRegistry) Sinn von CurrentKey
Immer diese pauschalen Aussagen... nutzlos für Dich vielleicht. Aber es gibt noch eine Reg*-API-Aufrufe, die nicht in TRegistry gekapselt sind, und wenn man die haben möchte, braucht man ein Handle eines geöffneten Schlüssels. Auch die implementierten Aufrufe sind nicht vollständig, vielleicht will man mal andere als die drei simplen Registry-Datentypen lesen oder schreiben, ohne gleich alles direkt mit der API zu implementieren. Oder man kommuniziert über Delphi-Grenzen hinweg etwa mit gelinkten DLLs.
|
AW: (TRegistry) Sinn von CurrentKey
Nebenbei kann man theoretisch aus diesem Handle auch wieder den Pfad herausholen. Dafür kann man
![]() Normalerweise braucht man das Handle aber natürlich wirklich nur für die passenden API Aufrufe. |
AW: (TRegistry) Sinn von CurrentKey
In der Tat, da kann es Anwendungsfälle geben. Ich wunderte mich bloß, weil in der Hilfe nichts darüber stand.
Alles klar lg Caps |
AW: (TRegistry) Sinn von CurrentKey
Ich muss mich hier mal einklinken und das Thema wieder aufmachen. Denn man gelangt hierhin, wenn man CurrentKey und/oder CurrentPath in der Suche eingibt:
![]()
Delphi-Quellcode:
schon angesprochen. Bei einem von mir verwendeten Code (Siehe das Thema
property CurrentPath: string read FCurrentPath;
![]()
Delphi-Quellcode:
Was an meiner Code-Variante ist falsch?
Procedure TMainForm.SearchReg;
Var SearchStr : String; Procedure EnumAllKeys(hkey: THandle); Var l : TStringList; n : Integer; S : String; Begin With TRegistry.Create Do Try RootKey:=hkey; OpenKeyReadOnly(EmptyStr); l:=TStringList.Create; Try GetKeynames(l); CloseKey; For n:=0 To Pred(l.Count) Do Begin S:=l[n]; If Pos(SearchStr, UpperCase(S)) > 0 Then LBRegistry.Items.Append(CurrentPath + '#'); // Warum ist das leer??? If OpenKeyReadOnly(S) Then Begin EnumAllKeys(CurrentKey); CloseKey; End; End; Finally l.Free End; Finally Free; End; End; Begin SearchStr:=UpperCase(EDSearch.Text); LBRegistry.Items.Clear; LBRegistry.Items.BeginUpdate; Try // EnumAllKeys(HKEY_CLASSES_ROOT ); // EnumAllKEys(HKEY_CURRENT_USER ); EnumAllKEys(HKEY_LOCAL_MACHINE ); // EnumAllKEys(HKEY_USERS ); // EnumAllKEys(HKEY_PERFORMANCE_DATA); // EnumAllKEys(HKEY_CURRENT_CONFIG ); // EnumAllKEys(HKEY_DYN_DATA ); Finally LBRegistry.Items.EndUpdate; End; End; [edit] Es scheint ein Problem mit CurrentPath zu geben. Anders lässt sich nicht erklären, warum z.B. in ![]()
Delphi-Quellcode:
zwischengespeichert wird.
KeyName_
Ich wäre für Erhellung trotzdem dankbar. [/edit] Gruß, Alex |
AW: (TRegistry) Sinn von CurrentKey
Wieso sollte das ein Fehler sein?
Delphi-Quellcode:
aka
OpenKeyReadOnly(EmptyStr);
Delphi-Quellcode:
, womit der Pfad also wirklixh
OpenKeyReadOnly('');
Delphi-Quellcode:
ist. :roll:
''
Und da vorher auch noch
Delphi-Quellcode:
aufgerufen wurde, ist das erst Recht
CloseKey;
Delphi-Quellcode:
, denn dieses Property wird beim Schließen leergemacht.
''
Es wird zwar danach nochmal der Key geöffnet, aber auch gleich wieder geschlossen, so daß es im nächsten Schleifendurchgang auch wieder korrekt
Delphi-Quellcode:
ist.
''
PS: OpenKeyReadOnly hat nicht umsonst ein Result. |
AW: (TRegistry) Sinn von CurrentKey
Zitat:
Ich habe jetzt eine weitere lokale Variable definiert und darin an mehreren Stellen
Delphi-Quellcode:
abgefragt - Ergebnis: immer leer. Das wiederum verstehe ich nicht. Denn wenn die Procedure rekursiv aufgerufen und
CurrentPath
Delphi-Quellcode:
gesetzt wurde, wäre nach meinem Verständnis der aktuelle (Unter)Schlüssel geöffnet. In CurrentPath sollte also nach meinem Verständnis was sinnvolles stehen; tut es aber nicht.
Rootkey:=hkey;
Also formuliere ich meine Frage mal um/anders: Wie komme ich an den aktuelle Pfad? Wenn ich den gesuchten String gefunden habe, will ich ja die Fundstelle auch ausgeben. |
AW: (TRegistry) Sinn von CurrentKey
Da wo der Key offen ist und wo er nicht mit
Delphi-Quellcode:
geöffnet wurde, da ist in CurrentKey auch das enthalten, was reingegeben wurde. (der relative Pfad zum RootKey)
''
An der Stelle, wo du CurrentKey auslesen wolltest, da kannst du auch direkt
Delphi-Quellcode:
, bzw.
l[n]
Delphi-Quellcode:
verwenden, welches dem CurrentKey entspricht, innerhalb des nachfolgenden IFs.
S
Delphi-Quellcode:
S:=l[n];
If OpenKeyReadOnly(S) Then Begin If Pos(SearchStr, UpperCase(S)) > 0 Then LBRegistry.Items.Append(CurrentPath + '#'); // Warum ist das leer??? EnumAllKeys(CurrentKey); CloseKey; End;
Delphi-Quellcode:
S:=l[n];
If Pos(SearchStr, UpperCase(S)) > 0 Then LBRegistry.Items.Append(S + '#'); // Warum ist das leer??? If OpenKeyReadOnly(S) Then Begin EnumAllKeys(CurrentKey); CloseKey; End; |
AW: (TRegistry) Sinn von CurrentKey
Hallo,
Zitat:
Delphi-Quellcode:
oder
OpenKey
Delphi-Quellcode:
entsprechend öffnen (vollständige "Pfadangabe"!).
OpenKeyReadOnly
Wenn Du einen Unterschlüssel öffnest, kannst Du bis zum nächsten
Delphi-Quellcode:
(sinnvoll) auf
CloseKey
Delphi-Quellcode:
zugreifen - nach einem
CurrentPath
Delphi-Quellcode:
steht dann aber nix mehr zur Verfügung.
CloseKey
Versuch es doch mal so:
Delphi-Quellcode:
Gruß
procedure TForm3.Button1Click(Sender: TObject);
var SearchString : string; procedure EnumAllKeys (const Root : HKEY; const Key : string); var r : TRegistry; l : TStringList; i : Integer; s : string; begin r := TRegistry.Create; try r.RootKey := Root; if r.OpenKeyReadOnly (Key) then begin l := TStringList.Create; r.GetKeyNames (l); for i := 0 to l.Count - 1 do begin s := l [i]; if Pos (SearchString, UpperCase (s)) > 0 then ListBox1.Items.Add (r.CurrentPath + '\' + s); EnumAllKeys (Root, r.CurrentPath + '\' + s) end; r.CloseKey end; finally FreeAndNil (r); FreeAndNil (l) end end; begin SearchString := 'PRINT'; EnumAllKeys (HKEY_CURRENT_CONFIG, '') end; |
AW: (TRegistry) Sinn von CurrentKey
Zitat:
Delphi-Quellcode:
nicht initialisiert sei.
L
Und das Derjenige den Fehler natürlich auch behebt. |
AW: (TRegistry) Sinn von CurrentKey
Der Code ist sehr schön, bestätigt aber meine Annahme:
Der Pfad zum Key wird mitgeschleift. Wozu dann CurrenPath? Schlimmer noch ist der Umstand, dass ich CurrentPath jetzt testhalber mal unmittelbar vor dem rekursiven Aufruf eingefügt und mir ausgeben lasse. Es ist jetzt nicht mehr leer - immerhin ein Fortschritt. Aber CurrentPath ist identisch mit
Delphi-Quellcode:
bzw.
s
Delphi-Quellcode:
und wirft damit wieder die Frage auf: Wozu dann CurrenPath?
l[n]
Unter "path" verstehe ich eben nicht den aktuellen Key, sondern den gesamten Pfad. Ich überlege auch, ob ich mein Problem nicht dadurch löse, dass ich mit
Delphi-Quellcode:
einfach mal ein
ShellExecute
Delphi-Quellcode:
laufen lasse und dann die Ausgabe auswerte. Oder kennt jemand durch Zufall eine API-Funktion von Windows, mit der man die Registry nach einem Wert durchsuchen (lassen) kann?
reg query HKLM /d /k /v /f "10ec7b9.msp" /s > 10ec7b9.msp.txt
|
AW: (TRegistry) Sinn von CurrentKey
Weil sicht scheinbar aus einen HKEY kein Pfad auslesen lässt?
CurrentKey gibt immer nur "relativen" den Pfad zurück, welchen du namentlich geöffnet hast. Wenn du mit RootKey immer nur mitten drin einsteigst, dann kann in der ersten Ebene nie etwas drin stehen. Natürlich könntest du auch nur den Pfad weiterreichen und RootKey auf dem "Root" belassen, dann würde in CurrentKey auch der relative Pfad zum "Root" drinstehen. :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz