Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Registry auslesen funktioniert nicht (https://www.delphipraxis.net/173807-registry-auslesen-funktioniert-nicht.html)

Vielleichtmann 17. Mär 2013 16:05

Registry auslesen funktioniert nicht
 
Hallo,
ich habe auch schon drüben im Lazarusforum gefragt, aber doppelt hält ja besser :-)
Ich glaube, ich stehe gerade irgendwie auf dem Schlauch. Warum funktioniert diese Methode nicht, die Registry auszulesen. Ich möchte testweise den Wert von "HKEY_LOCAL_MACHINE\SOFTWARE\Lazarus\Capabilities\ ApplicationName" auslesen, dieser müsste eigentlich "Lazarus IDE" sein, aber wenn ich den Code ausführe, bekomme ich einen leeren Wert zurück. Woran könnte das liegen?

Delphi-Quellcode:
procedure TForm1.RegistryAuslesen;
var Registry: TRegistry;
    Test: string;
begin
  Registry:=TRegistry.Create;
  {Testweise auslesen von HKEY_LOCAL_MACHINE\SOFTWARE\Lazarus\Capabilities\ApplicationName}
  Registry.RootKey:=HKEY_LOCAL_MACHINE;
  Registry.OpenKey('SOFTWARE\Lazarus\Capabilities', true);
 
  Test:=Registry.ReadString('ApplicationName');
 
  ShowMessage(Test);
  {"Schließen" der Registry}
  Registry.CloseKey;
  Registry.free;
  end;
Dankeschön :-)

Furtbichler 17. Mär 2013 16:13

AW: Registry auslesen funktioniert nicht
 
Darfst Du das denn (Rechtemäßig)?

Vielleichtmann 17. Mär 2013 16:14

AW: Registry auslesen funktioniert nicht
 
Zitat:

Zitat von Furtbichler (Beitrag 1207811)
Darfst Du das denn (Rechtemäßig)?

Ich denke schon, dass ich meine eigene Registry auslesen darf oder? Ich denke für private Nutzung sollte das kein Problem sein.

Edit: Außerdem geht es später darum, die installierten Programme anzuzeigen und das sollte wirklich in Ordnung sein :D

Dalai 17. Mär 2013 16:24

AW: Registry auslesen funktioniert nicht
 
Die Methode TRegistry.OpenKey öffnet einen Schlüssel immer mit Schreibrechten, sofern man dem nicht vorbeugt. In HKLM dürfen nur Admins schreiben und daraus ergibt sich, dass Furtbichler wohl richtig liegt.

MfG Dalai

jfheins 17. Mär 2013 16:25

AW: Registry auslesen funktioniert nicht
 
Zitat:

Zitat von Vielleichtmann (Beitrag 1207812)
Ich denke schon, dass ich meine eigene Registry auslesen darf oder? Ich denke für private Nutzung sollte das kein Problem sein.
Edit: Außerdem geht es später darum, die installierten Programme anzuzeigen und das sollte wirklich in Ordnung sein :D

Das war nicht der Sinn der Frage ;-)
Aber wenn man das Programm normal startet, dann hat es in dem HKLM Zweig nur Leserechte und keine Schreibrechte. Dein Code versucht aber, mit Schreibrechten auf die Registry zuzugreifen.
Schau mal was es da noch so gibt: http://docwiki.embarcadero.com/Libra...penKeyReadOnly

Vielleichtmann 17. Mär 2013 16:34

AW: Registry auslesen funktioniert nicht
 
Zitat:

Zitat von jfheins (Beitrag 1207814)
Das war nicht der Sinn der Frage ;-)

Ach soll mir doch einer sagen, dass er Windows-Rechte meinte :D
Mit OpenKeyReadOnly bekomme ich allerdings auch kein Ergebnis, ich kriege nur ein false zurück.

Der schöne Günther 17. Mär 2013 17:03

AW: Registry auslesen funktioniert nicht
 
Wenn ich die Hilfe richtig verstanden habe, dann geht
Delphi-Quellcode:
OpenKeyReadOnly
erst mit vollen Rechten in den Schlüssel und schaltet dann wieder einen Gang auf
Delphi-Quellcode:
KEY_READ
herunter.

Wenn das Programm nicht mit Administratorrechten läuft würde ich besser erst die .Access-Property setzen und dann in die Registry tauchen.

Wenn ich mich richtig erinnere kann man als Standardbenutzer schon etwas in HKLM herumwühlen, aber manche Order/Schlüssel sind absolut tabu, da darf auch nicht mehr gelesen werden...

Vielleichtmann 17. Mär 2013 17:10

AW: Registry auslesen funktioniert nicht
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1207817)
Wenn das Programm nicht mit Administratorrechten läuft

Wobei mich dabei irritiert, dass das Programm auch dann nicht richtig läuft, wenn ich es als Administrator starte, obwohl die Rechte dann ja eigentlich kein Problem mehr sein dürften.

Sir Rufo 17. Mär 2013 17:31

AW: Registry auslesen funktioniert nicht
 
Zitat:

Zitat von Vielleichtmann (Beitrag 1207818)
Zitat:

Zitat von Der schöne Günther (Beitrag 1207817)
Wenn das Programm nicht mit Administratorrechten läuft

Wobei mich dabei irritiert, dass das Programm auch dann nicht richtig läuft, wenn ich es als Administrator starte, obwohl die Rechte dann ja eigentlich kein Problem mehr sein dürften.

Ab Win7 reicht nicht als sondern mit Adminrechten starten ;)

Vielleichtmann 17. Mär 2013 18:42

AW: Registry auslesen funktioniert nicht
 
Zitat:

Zitat von Sir Rufo (Beitrag 1207821)

Ab Win7 reicht nicht als sondern mit Adminrechten starten ;)

Funktioniert auch mit Adminrechten nicht :o

Furtbichler 17. Mär 2013 19:15

AW: Registry auslesen funktioniert nicht
 
Du musst die Registry Instanz so instantiieren:
Delphi-Quellcode:
Const
  KEY_WOW64_64KEY=$100;

...
Registry:=TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);
Dann geht es. Habs eben getestet (ich hab Win7 64bit).

Vielleichtmann 17. Mär 2013 21:18

AW: Registry auslesen funktioniert nicht
 
Zitat:

Zitat von Furtbichler (Beitrag 1207832)
Dann geht es. Habs eben getestet (ich hab Win7 64bit).

Funktioniert aus irgendwelchen Gründen ebenfalls nicht. Jedenfalls nicht unter Lazarus.

Furtbichler 17. Mär 2013 22:17

AW: Registry auslesen funktioniert nicht
 
Da ich kein Lazarus habe, klinke ich mich hier aus.

Na jedenfalls konnte ich dein Problem wenigstens bei mir unter Delphi nachvollziehen...

Tut mir leid.

Vielleichtmann 17. Mär 2013 23:55

AW: Registry auslesen funktioniert nicht
 
Zitat:

Zitat von Furtbichler (Beitrag 1207842)
Da ich kein Lazarus habe, klinke ich mich hier aus.

Es war jetzt letztendlich quasi das, was du meintest.

Delphi-Quellcode:
procedure TForm1.RegistryAuslesen;
var Registry: TRegistry;
    Test: string;
begin
  Registry:=TRegistry.Create(KEY_READ OR $0100);
  {Testweise auslesen von HKEY_LOCAL_MACHINE\SOFTWARE\Lazarus\Capabilities\ApplicationName}
  Registry.RootKey:=HKEY_LOCAL_MACHINE;
  Registry.OpenKey('\SOFTWARE\Lazarus\Capabilities', false);

  Test:=Registry.ReadString('ApplicationName');

  ShowMessage(Test);
  {"Schließen" der Registry}
  Registry.CloseKey;
  Registry.free;
end;
So läuft es zumindest schonmal unter 64-Bit. Trotzdem danke :-)

Edit: Und wenn mir dann noch jemand helfen könnte, wie ich alle Schlüssel eines Ordners in der Registry auslesen kann, wär das natürlich noch ideal.

DeddyH 18. Mär 2013 07:09

AW: Registry auslesen funktioniert nicht
 
http://docwiki.embarcadero.com/Libra...ry.GetKeyNames
Ich vermute, das oder zumindest etwas Ähnliches ist auch unter Lazarus verfügbar.

Andreas L. 18. Mär 2013 09:00

AW: Registry auslesen funktioniert nicht
 
Ein Ressourcenschutzblock und die Auswertung des Rückgabewertes von OpenKey täte deinen Code auch gut.

Delphi-Quellcode:
procedure TForm1.RegistryAuslesen;
var Registry: TRegistry;
    Test: string;
begin
  Registry := TRegistry.Create(KEY_READ OR $0100);
  try
    {Testweise auslesen von HKEY_LOCAL_MACHINE\SOFTWARE\Lazarus\Capabilities\ApplicationName}
    Registry.RootKey:=HKEY_LOCAL_MACHINE;
    if Registry.OpenKey('\SOFTWARE\Lazarus\Capabilities', false) then
    begin
      Test := Registry.ReadString('ApplicationName');
      ShowMessage(Test);

      {"Schließen" der Registry}
      Registry.CloseKey;
    end;
  finally
    Registry.free; // oder FreeAndNil(Registry)
  end;
end;

Vielleichtmann 18. Mär 2013 10:17

AW: Registry auslesen funktioniert nicht
 
Zitat:

Zitat von DeddyH (Beitrag 1207852)
Ich vermute, das oder zumindest etwas Ähnliches ist auch unter Lazarus verfügbar.

Ok, danke :-) Anscheinend ist das gar nicht so schwer, wenn man weiß, wonach man suchen muss...

Zitat:

Zitat von Andreas L. (Beitrag 1207857)
Ein Ressourcenschutzblock und die Auswertung des Rückgabewertes von OpenKey täte deinen Code auch gut.

Wird später noch alles kommen, erstmal muss das Grundlegende funktionieren :D

Sir Rufo 18. Mär 2013 23:15

AW: Registry auslesen funktioniert nicht
 
Zitat:

Zitat von Vielleichtmann (Beitrag 1207870)
Zitat:

Zitat von Andreas L. (Beitrag 1207857)
Ein Ressourcenschutzblock und die Auswertung des Rückgabewertes von OpenKey täte deinen Code auch gut.

Wird später noch alles kommen, erstmal muss das Grundlegende funktionieren :D

Nach einer gewissen Zeit wird das zur Routine und dann zum Reflex ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz