TRegistry - lesen, schreiben, überprüfen

Antworten
bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

TRegistry - lesen, schreiben, überprüfen

Beitrag von bembulak »

Hallo Leute!

Gerade bastle ich an einer Kleinigkeit, für die ich unter Windows gerne Zugriff auf die Registry hätte.
Eine Suche im Internet ist zwar grundsätzlich sehr ergibig, aber nicht 100% das, was ich brauche, um es auch zu verstehen. Deswegen hoffe ich, ihr könnt meinem Verständnis ein wenig auf die Sprünge helfen.

Also, hier ein möglichst genaue Problembeschreibung:
Mein kleines Tool soll auf Wunsch beim Systemstart automatisch mitstarten. Da ich für dieses kleine Tool aber kein Setup machen will, welches das Programm im Autostart-Ordner des Benutzers anlegt, dachte ich mir, es wäre doch ganz einfach in den Einstellungen des Programms eine kleine CheckBox zu machen, die - sofern Checked = True ist - ein Schlüssel unter
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\' anzulegen.

Die Struktur dieses Schlüssels sollte dann sein:

Code: Alles auswählen

Name           |      Typ   |      Wert                         
Programmname   |    REG_SZ  |    AktuellerProgrammpfad


Also das Öffnen und Schreiben (also erzeugen) eines Strings in die Registry ist ja noch relativ einfach:

Code: Alles auswählen

Procedure CreateKey(aProgName, aProgPath : String);
Var
    Reg : TRegistry;
Begin
    Reg := TRegistry.Create;
    Reg.RootKey := 'Software\Microsoft\Windows\CurrentVersion\Run\', False);
 
    // einen Eintrag hinzufügen:
    Reg.WriteString(aProgName, aProgPath);
 
    Reg.CloseKey;
    Reg.Free;
End;


Beim Lesen und überprüfen, ob ein Eintrag existiert, scheitere ich jedoch kläglich.
Hintergrund ist folgender: wird der Dialog mit den Einstellungen aufgerufen, so muss das Programm überprüfen, ob der Schlüssel existiert. Wenn ja, muss TCheckBox.Checked auch True sein. Existiert der Eintrag nicht, bleibt TCheckBox.Checked natürlich False.

Hakt der User die Option an, wird der Schlüssel, wie oben, geschrieben.

Wie also kann ich bitte überprüfen, ob der Schlüssel existiert und ob der Pfad zum Programm noch stimmt?

Danke schon mal für eure Anregungen.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Versteh dein Problem nicht ganz.
Es gibt doch Reg.ValueExists und Reg.KeyExists.
Geht das denn nicht?

Aber dass das mit diesem Rootkey klappt, hätte ich nicht gedacht.
Normalerweise ist doch (soweit ich mich an Windows erinnern kann ;-)
Rootkey sowas wie HKEY_CURRENT_USER und den Schlüssel öffnet man mit OpenKey oder OpenKeyReadOnly

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Beitrag von bembulak »

Es ist eher ein generelles Problem. Deswegen die Frage.
Aber egal, es hat sich erledigt. Ich habe im Netz eine kleine, feine Prozedur gefunden, die je nach Parameter genau das macht, was ich will.

Hier, vielleicht kann das ja mal jemand brauchen:

Code: Alles auswählen

Procedure Tform1.RunOnStartUp(
              aTitle,
              aFile : String;
              aPrivate,
              aRunOnlyOnce: Boolean;
              aDelete : Boolean = False);
Const
     cRegRoot: Array [Boolean] of HKEY = (HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER);
     cRegKey : Array [Boolean] of String = ('Run', 'RunOnce');
Var
     Reg : TRegistry;
Begin
 
    Reg := tRegistry.Create;
 
    Try
       Reg.RootKey := cRegRoot [aPrivate];
       Reg.OpenKey(
                   'Software\Microsoft\Windows\CurrentVersion\'
                   + cRegKey[aRunOnlyOnce], False
                   );
 
    if not aDelete then
       Reg.WriteString(aTitle, aFile)
    Else if Reg.ValueExists(aTitle) then
       Reg.DeleteValue (aTitle);
    finally
       Reg.Free;
    End;
End;


Usage:

Code: Alles auswählen

{Erstellt den Eintrag in HKEY_CURRENT_USER unter Run }
RunOnStartUp('BEMBU', 'C:\test.exe', True, False);

Antworten