Autor |
Beitrag |
andras
      
Beiträge: 460
Win XP, Win Vista Home Premium, Ubuntu Dapper Drake
Delphi 2005 Pers
|
Verfasst: Do 20.04.06 15:42
hallo!
ich hab ein problem mit der registry. ich möchte abfragen, ob ein bestimmter wert existiert. mein code gibt aber immer nein zurück, obwohl der werte existier.
Delphi-Quelltext 1: 2: 3: 4: 5:
| regist:=TRegistry.Create; regist.Rootkey:=HKEY_CURRENT_USER; regist.OpenKey('HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\',false); if regist.ValueExists('CTFMON.EXE')=true then ShowMessage('ja') else ShowMessage('nein'); regist.Destroy; |
hoffe es kann mir wer helfen!!
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: Do 20.04.06 19:00
Bei mir heist der Wert 'ctfmon.exe /login'. Ich weis nicht wie gut ValueExists ist, wenn es um so etwas geht.
Tschö,
nullplan
P.S.: Du kanst es auch wie folgt versuchen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function ValueExistAtLeastABit(value : string): boolean; var regfile:file of text; command : PChar;
function valinstr(v, s: string):boolean; var i:byte; begin for i:= 1 to length(v) do v[i]:=UpCase(v[i]); for i:= 1 to length(s) do s[i]:=UpCase(s[i]); Result := (Pos(s,v) <> 0); end;
begin command := 'regedit /e tmp.reg "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"'; CreateProcess(command,command,0,0,false,0,0,0,nil); assign(regfile,'tmp.reg'); repeat readln(regfile,command); until valinstr(value,command) or eof(regfile); Result:= not eof(regfile); end; |
Kein Anspruch auf Heiligen Gral.
_________________ Ich fahr' nicht selber, weil ich festgestellt habe: ich fahre zu emotional. Bin 180 gefahren wo 30 erlaubt war... -- Jürgen von der Lippe
Zuletzt bearbeitet von nullplan001 am Fr 21.04.06 18:44, insgesamt 2-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 20.04.06 19:14
andras hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5:
| regist:=TRegistry.Create; regist.Rootkey:=HKEY_CURRENT_USER; regist.OpenKey('HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\',false); if regist.ValueExists('CTFMON.EXE')=true then ShowMessage('ja') else ShowMessage('nein'); regist.Destroy; | |
Das ist ja so auch falsch! In OpenKey bist du doch schon in HKEY_CURRENT_USER und deshalb darfst du das nicht mehr angeben.
Und wenn du es korrekt gemacht hättest, dann hättest du es gemerkt, weil OpenKey einen boolschen Wert zurückgibt, ob es erfolgreich war....
Die andere Sache: Destroy sollte nicht direkt aufgerufen werden! Du solltest Free benutzen, weil das vorher prüft, ob das Objekt überhaupt noch existiert!
Was soll eigentlich das "=True" bewirken? Ich meine "True = True" ist wieder True und "False = True" ist wieder False...
Das kannst du einfach weglassen!
So ist es richtig:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| regist := TRegistry.Create; regist.Rootkey := HKEY_CURRENT_USER; if regist.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run\', false) and regist.ValueExists('CTFMON.EXE') then begin ShowMessage('ja'); regist.CloseKey; end else ShowMessage('nein'); regist.Free; |
Und eigentlich brauchst du auch keine Variable regist, aber das nur nebenbei...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| with TRegistry.Create do begin Rootkey := HKEY_CURRENT_USER; if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run\', false) and ValueExists('CTFMON.EXE') then begin ShowMessage('ja'); CloseKey; end else ShowMessage('nein'); Free; end; |
nullplan001 hat folgendes geschrieben: | Bei mir heist der Wert 'ctfmon.exe /login'. Ich weis nicht wie gut ValueExists ist, wenn es um so etwas geht. |
Was meinst du mit "wie gut"??? Nicht genau so lautende Werte findet die Funktion natürlich nicht, aber das soll sie ja auch nicht.
Bei mir heißt der Wert übrigens auch "ctfmon.exe"...
Sinnvoller wäre wohl, alle Schlüssel enumerieren zu lassen und dann das Vorkommen von ctfmon.exe zu prüfen...
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 20.04.06 19:20
nullplan001 hat folgendes geschrieben: | Bei mir heist der Wert 'ctfmon.exe /login'. Ich weis nicht wie gut ValueExists ist, wenn es um so etwas geht.
Tschö,
nullplan
P.S.: Du kanst es auch wie folgt versuchen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function ValueExistAtLeastABit(value : string): boolean; var regfile:file of text; command : PChar;
function valinstr(v, s: string):boolean; var i:byte; begin for i:= 1 to length(v) do v[i]:=UpCase(v[i]); for i:= 1 to length(s) do s[i]:=UpCase(s[i]); if Pos(s,v) <> 0 then Result := true else Result := false; end;
begin command := 'regedit /e tmp.reg "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"'; CreateProcess(command,command,0,0,false,0,0,0,nil); assign(regfile,'tmp.reg'); repeat readln(regfile,command); until valinstr(value,command) or eof(regfile); if eof(regfile) then Result:=false else Result:=true; end; |
Kein Anspruch auf Heiligen Gral. |
Autsch!!!! Was wird das denn??? TRegistry bietet durchaus die Möglichkeit, alle Werte unter einem Schlüssel aufzulisten!
Und was soll ValInStr?
Delphi-Quelltext 1:
| Pos(LowerCase(...), LowerCase(...)) > 0 |
Das macht dasselbe...
Entschuldige, aber diese Lösung:
Na ja, wo das Problem liegt, habe ich ja eben gepostet...
|
|
andras 
      
Beiträge: 460
Win XP, Win Vista Home Premium, Ubuntu Dapper Drake
Delphi 2005 Pers
|
Verfasst: Fr 21.04.06 22:35
hallo!
danke!!!!!!! die version von jaenicke hab ich gebraucht!! jetzt funktioniert alles! und ich bin glücklich
DANKE!!!
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: Sa 22.04.06 10:40
jaenicke hat folgendes geschrieben: |
Entschuldige, aber diese Lösung: |
Wie ich schon schrieb: Kein Anspruch auf Heiligen Gral. Wenn ich kein WinAPI verwenden will/kann, mache ich es eben mit Registry-Ex- und -Importen. Da brauche ich eine ganze Unit nicht einzubinden. Und zwar eine ganze riesige Unit. Die nebenbei noch alle Funktionen enthält, die ich nicht brauche. Gut, ist mit Smartlinking kein Ding, fördert aber die Fähigkeiten in den Bereichen DOS, Textfiles und Regfiles (Befehl ausführen, Textdatei nach Reg-Datei-Schema erstellen). Und außerdem: Findet eben auch Values, die nur als Teilstrings vorliegen (wie eben 'ctfmon' in 'ctfmon /login'), ebenso Wertnamen ('Synchro' in 'Synchronization Manager') und Schlüssel ('Current' in 'CurrentVersion').
Tschö,
nullplan
_________________ Ich fahr' nicht selber, weil ich festgestellt habe: ich fahre zu emotional. Bin 180 gefahren wo 30 erlaubt war... -- Jürgen von der Lippe
|
|
|