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/)
-   -   Registry bei Windows 7 32bit mit Delphi 2009 auslesen (https://www.delphipraxis.net/163094-registry-bei-windows-7-32bit-mit-delphi-2009-auslesen.html)

Alex.P 15. Sep 2011 11:40


Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Hallo,

ich bin von Win XP auf Win 7 32bit umgezogen.
Unter XP konnte ich die vorhandenen COM Ports mit folgenden Code aus der Registry lesen:

Code:
reg := TRegistry.Create;

  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    reg.OpenKey('hardware\devicemap\serialcomm', False);

    reg.GetValueNames(TempResult);
    for i := 0 to TempResult.Count - 1 do
        Result.Add(reg.Readstring(TempResult.strings[i]));
    reg.CloseKey
  finally
    reg.Free;
    TempResult.Free;
  end;
Unter Windows 7 liefert die Funktion GetValueNames eine leere Liste zurück.
Der Pfad und der Inhalt des Registry Schlüssels ist zu XP gleich geblieben.

Luckie 15. Sep 2011 11:45

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Ins blaue geraten: Unter XP hast du als Administrator gearbeitet unter Windows 7 bist du das nicht mehr. TRegistry.Create(...) öffnet den Schlüssel aber lesend und schreibend. Das schlägt unter Windows 7 fehl, weil du im Hive HKLM keine Schreibrechte hast. Eine entsprechende Fehlerbehandlung hätte wahrscheinlich den Fehler "Zugriff verweigert" zurückgegeben. Was dir auch gleich den Hinweis gegeben hätte, warum es nicht funktioniert.

Andreas L. 15. Sep 2011 11:47

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Dem Konstrukor von TRegistry kann man den Parameter KEY_READ übergeben, damit das Objekt im Nur-Lesen-Modus erzeugt wird. Außerdem hat OpenKey einen Rückgabewert den man auswerten sollte.

Luckie 15. Sep 2011 11:50

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Delphi-Quellcode:
procedure foo;
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('hardware\devicemap\serialcomm', False)then
    begin
      // ...;
      // ...;
      reg.CloseKey
    end
    else
      RaiseLastOSError;
  finally
    reg.Free;
  end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
   try
     foo;
   except
     on e: Exception do
       ShowMessage(e.Message);
   end;
end;

SirThornberry 15. Sep 2011 11:51

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Wäre es hier nicht sicherer die dafür vorgesehene Api-funktion zu verwenden?

Luckie 15. Sep 2011 11:53

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Zitat:

Zitat von SirThornberry (Beitrag 1124523)
Wäre es hier nicht sicherer die dafür vorgesehene Api-funktion zu verwenden?

Wenn es die gibt sicher. Welche wäre denn das?

DeddyH 15. Sep 2011 12:23

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
So geht es bei mir unter Vista 32 (kein Admin-Account):
Delphi-Quellcode:
procedure ListComPorts(ResultList: TStrings);
var
  reg: TRegistry;
  i: integer;
  TempResult: TStringlist;
begin
  TempResult := TStringlist.Create;
  try
    reg := TRegistry.Create(KEY_READ);
    try
      reg.RootKey := HKEY_LOCAL_MACHINE;
      if reg.OpenKey('hardware\devicemap\serialcomm', False) then
        begin
          reg.GetValueNames(TempResult);
          for i := 0 to TempResult.Count - 1 do
            ResultList.Add(reg.Readstring(TempResult.strings[i]));
          reg.CloseKey;
        end;
    finally
      reg.Free;
    end;
  finally
    TempResult.Free;
  end;
end;
[edit] BTW: Interessanter Artikel dazu: http://www.codeproject.com/KB/system...enum_fifo.aspx, aber ganz ohne die Registry kommt man wohl auch dort nicht aus, sofern meine bescheidenen C++-Kenntnisse ausreichen. [/edit]

hathor 15. Sep 2011 12:42

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Verständnisfrage:

Wozu reg.CloseKey; wenn reg.OpenKey nicht funktioniert ?

DeddyH 15. Sep 2011 12:43

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Wen meinst Du?

hathor 15. Sep 2011 12:49

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Alle...:-D

Wenn reg.CloseKey; nach einem missglückten reg.OpenKey aufgerufen wird - was passiert dann?
Nichts???

DeddyH 15. Sep 2011 12:54

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Ein Blick in die Hilfe bringt Erstaunliches zu Tage:
Zitat:

Ein Aufruf von CloseKey hat keinen Effekt, wenn aktuell kein Schlüssel geöffnet ist.
Abgesehen davon rufen Luckie und ich nur dann CloseKey auf, wenn OpenKey auch erfolgreich war ;)

himitsu 15. Sep 2011 13:43

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Wer will, kann auch noch Delphi-Referenz durchsuchenTRegisty.OpenKeyReadOnly verwenden.

Alex.P 15. Sep 2011 14:16

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Hallo,

danke für die zahlreichen Antworten. Ich werde das gleich mal ausprobieren.
Version 1.0 ist leider schon rum ums Eck. Bin jetzt bei 5.0

Alex.P 15. Sep 2011 15:56

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Create mit KEY_READ ausführen, dann klapps auch wieder mit Windows 7

Code:
TRegistry.Create(KEY_READ);

DeddyH 15. Sep 2011 15:57

AW: Registry bei Windows 7 32bit mit Delphi 2009 auslesen
 
Siehe #3 und #7.

DP-Maintenance 25. Sep 2011 19:22

Dieses Thema wurde am "25. Sep 2011, 20:22 Uhr" von "MrSpock" aus dem Forum "Betriebssysteme" in das Forum "Win32/Win64 API (native code)" verschoben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 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