Autor Beitrag
andras
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 460

Win XP, Win Vista Home Premium, Ubuntu Dapper Drake
Delphi 2005 Pers
BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 20.04.06 19:14 
user profile iconandras hat folgendes geschrieben:
ausblenden 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:
ausblenden 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
    // Das nach dem and wird nur dann abgearbeitet, wenn das erste true ist, 
    // weil sonst ja sowieso nicht mehr beides true werden kann...
    ShowMessage('ja');
    regist.CloseKey;
  end
  else 
    ShowMessage('nein');
  regist.Free;


Und eigentlich brauchst du auch keine Variable regist, aber das nur nebenbei...
ausblenden 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;


user profile iconnullplan001 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 20.04.06 19:20 
user profile iconnullplan001 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:
ausblenden 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?
ausblenden Delphi-Quelltext
1:
Pos(LowerCase(...), LowerCase(...)) > 0					

Das macht dasselbe...
Entschuldige, aber diese Lösung: :puke:

Na ja, wo das Problem liegt, habe ich ja eben gepostet...
andras Threadstarter
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 460

Win XP, Win Vista Home Premium, Ubuntu Dapper Drake
Delphi 2005 Pers
BeitragVerfasst: Fr 21.04.06 22:35 
hallo!
danke!!!!!!! die version von jaenicke hab ich gebraucht!! jetzt funktioniert alles! und ich bin glücklich :dance:
DANKE!!!
nullplan001
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
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)
BeitragVerfasst: Sa 22.04.06 10:40 
user profile iconjaenicke hat folgendes geschrieben:

Entschuldige, aber diese Lösung: :puke:

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