Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Probleme beim Auslesen von Registry Keys

  Alt 7. Okt 2015, 18:37
Ab welcher Version gibt es denn die Methode?

Und warum sollte ein Aufruf von RaiseLastOSError zu Problemen führen? Mit deiner Begründung dürfte man die Funktion nie aufrufen, egal in was für einen Code.
Nun schauen wir an, was die Doku dazu sagt:
Zitat:
You should call the GetLastError function immediately when a function's return value indicates that such a call will return useful data. That is because some functions call SetLastError with a zero when they succeed, wiping out the error code set by the most recently failed function.
Und ohne eine genaue Analyse der Klasse TRegistry kann man nicht sagen, was da noch für API-Calls ausgeführt werden. Somit wäre das ein Fall von "kann funktionieren, muss aber nicht und vor allem kann irgendwann dann mal gar nicht mehr funktionieren".

Sinnvoll ist hier auch ein ClassHelper
Delphi-Quellcode:
interface

uses
  System.Win.Registry;

type
  HRegistry = class helper for TRegistry
    procedure ThrowLastError( const AdditionalInfo: string = '' );
    procedure OpenKeySafe( const Key: string; CanCreate: Boolean );
    procedure OpenKeyReadOnlySafe( const Key: string );
  end;

implementation

uses
  System.StrUtils,
  System.SysUtils;

{ HRegistry }

procedure HRegistry.OpenKeyReadOnlySafe( const Key: string );
begin
  if not OpenKeyReadOnly( Key )
  then
    ThrowLastError( Key );
end;

procedure HRegistry.OpenKeySafe( const Key: string; CanCreate: Boolean );
begin
  if not OpenKey( Key, CanCreate )
  then
    ThrowLastError( Key );
end;

procedure HRegistry.ThrowLastError( const AdditionalInfo: string );
begin
  if AdditionalInfo = ''
  then
    RaiseLastOSError( LastError )
  else
    RaiseLastOSError( LastError, sLineBreak + AdditionalInfo );
end;
Und dann sieht das so aus
Delphi-Quellcode:
procedure TForm1.Button30Click(Sender: TObject);

var
  regKey : TRegistry;
begin
  regKey := TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);
  Try
    regKey.RootKey := HKEY_LOCAL_MACHINE;
    regKey.OpenKeyReadOnlySafe('SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update');
    try
      ShowMessage( regKey.ReadString( 'NextDetectionTime' ) );
    finally
      regKey.CloseKey();
    end;
  Finally
    regKey.Free;
  End;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 7. Okt 2015 um 18:40 Uhr)
  Mit Zitat antworten Zitat