Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Registry Lesen (https://www.delphipraxis.net/152783-registry-lesen.html)

Dieter11 6. Jul 2010 20:31

Registry Lesen
 
Hallo Zusammen,

ich hoffe, mir kann hier jemand helfen:

OS: Windows 7
Delphi 2007

Ich schreibe mit folgendem Code einen Eintrag in die Registry --> das funktioniert:

Delphi-Quellcode:
VAR
  Registry : TRegistry;
  WriteReportToRegistry : Boolean;

begin
  WriteReportToRegistry := True;
  Registry := TRegistry.Create;
  Registry.RootKey := HKEY_LOCAL_MACHINE;

  if Registry.KeyExists('\Software\SysIT\Nails4You') = False then
     Try
        Registry.CreateKey('\Software\SysIT\Nails4You');
     Except
        Registry.Free;
          WriteReportToRegistry := False;
          Registry.WriteString ('Mandant', DBEdit_MandantNr.Text);
        Exit;
     END;

  Try
    if Registry.OpenKey('\Software\SysIT\Nails4You', True) = True then
       Registry.WriteString ('Mandant', DBEdit_MandantNr.Text)
       ELSE
          Begin
              MessageDLG('Es konnte nicht in die Registry geschrieben werden', mtError, [mbOK], 0);
              Registry.WriteString (DBEdit_MandantNr.Text, DSN);
          End;

  Finally
      Registry.CloseKey;
      Registry.free;
  End;

Ich versuche, den Eintrag wie folgt auszulesen:

Delphi-Quellcode:
procedure Tfrm_Main.Button1Click(Sender: TObject);

var Registry: TRegistry;
var Test : String;
var mandant : String;
begin
  Registry := TRegistry.Create;
  try
    Registry.RootKey := HKEY_CURRENT_USER;
    Registry.OpenKey('Software\SysIT\Nails4You', true);

    Test := Registry.ReadString('Mandant') ;
   
//    except

 //   end;
  finally
//    Registry.free;
  end;

//  finally
//    regist.free;
//  end;

end;
Der Variable Test wird leider kein Wert zugeordnet.
Wo liegt denn der Fehler?

Danke.

Gruss

Dieter

Luckie 6. Jul 2010 20:37

AW: Registry Lesen
 
Hast du Administratorenrechte? Ist die UAC aktiv? ansonsten kann die Virtualisierung zuschlagen.

daywalker9 6. Jul 2010 20:39

AW: Registry Lesen
 
Also ich würde diesen Fehler erstmal rausnehmen:

Delphi-Quellcode:
        Registry.Free;
          WriteReportToRegistry := False;
          Registry.WriteString ('Mandant', DBEdit_MandantNr.Text);
        Exit;
Du freest bei except Registry und versuchst dann noch was mit der Klasse in die Registry schreiben

//edit: Du schreibst in HKEY_LOCAL_MACHINE und ließt aus HKEY_CURRENT_USER aus. Das wird der Fehler sein ;)
//edit2: Und lass das Vergleichen auf = True oder = False weg. Ich weiss nun nicht so auf die schnell ob das ein Problem ist. Du gibts beim Schreiben \SOFTWARE mit vorangegangem Slash an, wenn du das auch beim Schreiben machst?

mkinzler 6. Jul 2010 20:40

AW: Registry Lesen
 
Zitat:

Hast du Administratorenrechte? Ist die UAC aktiv? ansonsten kann die Virtualisierung zuschlagen.
Bei CURRENT_USER?

Dieter11 6. Jul 2010 20:51

AW: Registry Lesen
 
Hallo,

ja, ich habe die Adminrechte und lese jetzt auch aus HKEY_LOCAL_MACHINE-

Leider ohne Ergebnis.

Gruss

Dieter

Dieter11 6. Jul 2010 20:53

AW: Registry Lesen
 
Habe den Fehler gefunden.

Danke für Eure Unterstützung.

Gruss

Dieter

daywalker9 6. Jul 2010 20:56

AW: Registry Lesen
 
Und was wars?

Dieter11 6. Jul 2010 20:59

AW: Registry Lesen
 
Es waren 2 Fehler:

try
Registry.RootKey := HKEY_LOCAL_MACHINE;
Registry.OpenKey('Software\SysIT\Nails4You', true);

Test := Registry.ReadString('Mandant') ;
ShowMessage(Test);
// except
Mandant := Registry.ReadString('Mandant');

Luckie 6. Jul 2010 21:03

AW: Registry Lesen
 
Zitat:

Zitat von mkinzler (Beitrag 1033856)
Zitat:

Hast du Administratorenrechte? Ist die UAC aktiv? ansonsten kann die Virtualisierung zuschlagen.
Bei CURRENT_USER?

Also schreiben tut er nach HKLM.

mkinzler 6. Jul 2010 21:14

AW: Registry Lesen
 
Und gelesen aus HKCU

Dieter11 6. Jul 2010 22:01

AW: Registry Lesen
 
Ja, habe ich

Matze 7. Jul 2010 05:41

AW: Registry Lesen
 
Zu einem "OpenKey" gehört immer auch ein "CloseKey". Der Aufruf fehlt bei dir beim Auslesen. Beim Schreiben hast du diesen Aufruf drinnen. ;)

Das nur nebenbei bemerkt.

himitsu 7. Jul 2010 07:17

AW: Registry Lesen
 
Zitat:

Zitat von Matze (Beitrag 1033892)
Zu einem "OpenKey" gehört immer auch ein "CloseKey".

kann man ... muß man aber nicht :angel2:
Delphi-Quellcode:
function TRegistry.OpenKey(const Key: string; Cancreate: boolean): Boolean;
begin
  Result := CheckResult(RegOpenKeyEx(GetBaseKey(Relative), PChar(S), 0,
    FAccess, TempKey));
  ...
  if Result then
  begin
    ...
    ChangeKey(TempKey, S); <<<<<
  end;
end;

procedure TRegistry.ChangeKey(Value: HKey; const Path: string);
begin
  CloseKey; <<<<<
  ...;
end;
Und nochmal zum CloseKey vor Free.
Delphi-Quellcode:
destructor TRegistry.Destroy;
begin
  CloseKey; <<<<<
  inherited;
end;
PS:
Delphi-Quellcode:
Finally
  Registry.CloseKey;
  Registry.Free;
End;
und das ist Syntaktisch auch falsch.
(auch wenn es hier vermutlich in CloseKey nie zu einer Exception kommt)
Vor dem Free ruft man nix mehr auf ... denn wenn da was passieren würde, dann wäre der Resourcenschutzblock Wirkungslos, da Free dann dennoch nicht aufgerufen würde.

mkinzler 7. Jul 2010 07:20

AW: Registry Lesen
 
Sauberer ist aber wenn man sich angewöhnt alles zu Schliessen was man geöffnet hat unabhängig, b es 100% notwendig ist oder nicht

himitsu 7. Jul 2010 07:33

AW: Registry Lesen
 
Es ist ja nicht falsch es dennoch zu machen :D


Delphi-Quellcode:
VAR
  Registry : TRegistry;
  WriteReportToRegistry : Boolean;

begin
  WriteReportToRegistry := True;
  Registry := TRegistry.Create;
  Registry.RootKey := HKEY_LOCAL_MACHINE;

  if Registry.KeyExists('\Software\SysIT\Nails4You') = False then
     Try
        Registry.CreateKey('\Software\SysIT\Nails4You');
     Except
        Registry.Free;
          WriteReportToRegistry := False;
          ///// 1 /////
          Registry.WriteString ('Mandant', DBEdit_MandantNr.Text);
        Exit;
     END;

  Try
    if Registry.OpenKey('\Software\SysIT\Nails4You', True) = True then
       Registry.WriteString ('Mandant', DBEdit_MandantNr.Text)
       ELSE
          Begin
              MessageDLG('Es konnte nicht in die Registry geschrieben werden', mtError, [mbOK], 0);
              ///// 2 /////
              Registry.WriteString (DBEdit_MandantNr.Text, DSN);
          End;

  Finally
      Registry.CloseKey;
      Registry.free;
  End;
1: Der Key konnte nicht erstellt werden, Registry wurde auch schon freigegeben ... wie soll da jetzt eigentlich das WriteString ausgeführt werden?

2: Der Key konnte nicht geöffnet werden ... wohin will da WriteString denn nun schreiben?

3: Man prüft/vergleicht nicht auf True oder False.
Delphi-Quellcode:
if not Registry.KeyExists(...) = then
if Registry.OpenKey(...) then

mkinzler 7. Jul 2010 07:36

AW: Registry Lesen
 
@Frank: Du hast aber 2 mal darauf hingewiesen, dass es nicht notwendig ist, damit hast du genau diesen Eindruck erweckt!
Man sollte sich angewöhnen es trotzdem zu machen.

himitsu 7. Jul 2010 07:39

AW: Registry Lesen
 
War auch mehr ans Mätzchen gerichtet ... bei ihm klang es so, als wenn es unbedingt nötig ist. :stupid:

Wenn man sich das OpenKey als ChangeToKey vorstellt, dann wäre es wohl einleuchtender, warum man es nicht unbedingt wieder schließen muß. :angel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 Uhr.

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