Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prüfen, ob RegistryKey vorhanden ist? (https://www.delphipraxis.net/150947-pruefen-ob-registrykey-vorhanden-ist.html)

Jamah 1. Mai 2010 09:41


Prüfen, ob RegistryKey vorhanden ist?
 
Moin.
Ich versuche jetzt seit Stunden, mein Programm zum laufen zu bringen aber es will einfach nicht. Es soll einfach nur überprüfen, ob ein Key in der Registry vorhanden ist.
Aber ich habs echt in X verschiedenen Arten getestet, z.B. so:
Delphi-Quellcode:
begin
  result:= false;
  reg:= TRegistry.Create;
  try
    reg.RootKey:= HKEY_Local_Machine;
    if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\KeyName') = True then
      begin
       Name:= ('HKEY_Local_Machine\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\KeyName');
       result:= True;
      end;
  finally
     reg.Free;
  end;
end;
oder so:
Delphi-Quellcode:
begin
  result:= false;
  reg:= TRegistry.Create;
  try
    reg.RootKey:= HKEY_Local_Machine;
    if reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\KeyName', False) = True then
      begin
       Name:= ('HKEY_Local_Machine\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\KeyName');
       result:= True;
      end;
  finally
     reg.Free;
  end;
end;
und so:
Delphi-Quellcode:
begin
  result:= false;
  reg:= TRegistry.Create;
  try
    reg.RootKey:= HKEY_Local_Machine;
    reg.CurrentPath:= '\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\';
    if reg.KeyExists('KeyName') = True then
      begin
       Name:= ('HKEY_Local_Machine\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\KeyName');
       result:= True;
      end;
  finally
     reg.Free;
  end;
end;
Wahrscheinlich wieder irgendwas ganz primitives, das ih übersehen habe oder?

Danke für eure Hilfe

Luckie 1. Mai 2010 10:01

Re: Prüfen, ob RegistryKey vorhanden ist?
 
Zitat:

Es will nicht.
Aha. Und was kann ich mir, als jemand, der nicht vor deinem Computer sitzt, darunter vorstellen?

Jamah 1. Mai 2010 10:04

Re: Prüfen, ob RegistryKey vorhanden ist?
 
Er gibt mir immer aus, dass der Key nicht vorhanden ist, obwohl er existiert.
Beziehungsweise result ist immer false.
Sorry die Beschreibung oben war missverständlich. Hatte ich garnicht bemerkt.

Andreas L. 1. Mai 2010 10:07

Re: Prüfen, ob RegistryKey vorhanden ist?
 
Ganz wichtig: Man prüft einen Boolean nicht mit = TRUE oder = FALSE. Das ist nicht nur unlogisch sondern kann auch Fehler (insbesondere in Verbindung mit API-Funktionen) verursachen.

Delphi-Quellcode:
  if Reg.KeyExists then //richtig
    //true

  if not Reg.KeyExists then //richtig
    //false

  if Reg.KeyExists = TRUE then //falsch

  if Reg.KeyExists = FALSE then //falsch
Zu deinen Code: Du verwechselst den Schlüssel (Key, z. B. \SOFTWARE\Irgendwas\) mit dem Namen eines Wertes (KeyName).

Delphi-Quellcode:
  Result := False;

  Reg := TRegistry.Create(KEY_READ); //Reg Nur-Lesen öffnen, dann brauchen wir auch keine Adminrechte
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\', False) then
    begin
      Result := Reg.ValueExists('KeyName');
    end;
  finally
    Reg.Free;
  end;

Jamah 1. Mai 2010 10:11

Re: Prüfen, ob RegistryKey vorhanden ist?
 
Oh. Da war mein code doch mal wieder ein Griff ins Klo. :lol:

Falls ich den Key jetzt bearbeiten wollte, würde es aber reichen, einfach das (KEY_READ) wegzulassen, oder? Und nebenbei falls das Programm dann immer als Administrator gestrtet werden muss, kann man das gleich im Code mitgeben oder abfragen, damit dadurch keine Fehler entstehen?

Danke

Luckie 1. Mai 2010 10:12

Re: Prüfen, ob RegistryKey vorhanden ist?
 
Und unter Vista und höher schlägt wahrscheinlich auch noch die Virtualisierung zu, da du den Schlüssel mit allen Rechnen öffnest. Als normaler Benutzer hast du aber keine Schreibrechte unter HKLM. Öffne den Schlüssel also nur zum Lesen.

Andreas L. 1. Mai 2010 10:15

Re: Prüfen, ob RegistryKey vorhanden ist?
 
Zitat:

Zitat von Jamah
Falls ich den Key jetzt bearbeiten wollte, würde es aber reichen, einfach das (KEY_READ) wegzulassen, oder?

Normalerweise schon, du kannst dir ja mal in der Delphi-Hilfe anschauen welche Konstanten da man noch so alles übergeben kann :wink:
Zitat:

Zitat von Jamah
Und nebenbei falls das Programm dann immer als Administrator gestrtet werden muss, kann man das gleich im Code mitgeben oder abfragen, damit dadurch keine Fehler entstehen?

Such mal im Forum bzw. in MSDN nach IsUserAdmin oder UserIsAdmin oder ähnlich. Damit kannst abfragen ob der aktuelle Nutzer Admin-Rechte hat.

Luckie 1. Mai 2010 10:19

Re: Prüfen, ob RegistryKey vorhanden ist?
 
Aber vorsicht. Unter Vista und höher ist Administrator nicht gleich Administrator!

Andreas L. 1. Mai 2010 10:26

Re: Prüfen, ob RegistryKey vorhanden ist?
 
Zitat:

Zitat von Luckie
Aber vorsicht. Unter Vista und höher ist Administrator nicht gleich Administrator!

Ja, wegen UAC richtig? Soweit ich weiß gibt die API-Funktion IsUserAnAdmin (http://msdn.microsoft.com/en-us/library/bb776463.aspx) false zurück wenn der User zwar Admin ist aber trotzdem nur Benutzer-Rechte hat.

Jamah 1. Mai 2010 11:00

Re: Prüfen, ob RegistryKey vorhanden ist?
 
Ich brauch nochmal Rat.
ich hab hier jetzt das hier fabriziert:

Delphi-Quellcode:
function RegCheck():Boolean;
begin
  result:= false;
  reg:= TRegistry.Create;
  try
    reg.RootKey:= HKEY_Local_Machine;
    if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\') then
      begin
        if reg.ValueExists('KeyName') then
          begin
            Name:= ('HKEY_Local_Machine\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\KeyName');
            result:= True;
            x:= 1;
          end;
      end;
    reg.RootKey:= HKEY_Current_User;
    if reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\', False) then
    begin
      if reg.ValueExists('KeyName') then
          begin
            Name:= ('HKEY_Current_User\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\KeyName');
            result:= True;
            x:= 2;
          end;
    end;
  finally
     reg.Free;
  end;
end;
Ich bekomme als Result zwar True, was richtig ist, allerdings wird x nicht deklariert, und die name-ausgabe liefert: 'Form1', und das obwohl die nirgendwo als 'Form1' definiert wird.

Was nu?
Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 Uhr.
Seite 1 von 4  1 23     Letzte »    

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