AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kapseln von Registryzugriffen

Ein Thema von Schwedenbitter · begonnen am 21. Sep 2009 · letzter Beitrag vom 22. Sep 2009
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Kapseln von Registryzugriffen

  Alt 21. Sep 2009, 15:54
Keine Ahnung woran es gelegen hat. Aber das Konzept war sowieso nicht schön. Hier mal meine Version:
Delphi-Quellcode:
unit AdvoPlex_Object;

interface

uses
  Windows,
  Classes,
  SysUtils,
  Registry;

const
  ADVOPATH = 'Software\AdvoSolutions\AdvoPlex';

type
  TAdvoPlex = class(TObject)
  private
    FUserSU: string;
    function CurrentUser: string;
    function GetUserSU: string;
    procedure SetUserSU(Value: string);
  public
    constructor Create;
    destructor Destroy; override;
  published
    property UserSU: string read GetUserSu write SetUserSU;
    procedure SaveUserSU;
    procedure LoadUserSU;
  end;

implementation

constructor TAdvoPlex.Create;
begin
  inherited Create;
end;

destructor TAdvoPlex.Destroy;
begin
  inherited Destroy;
end;

function TAdvoPlex.GetUserSU: string;
begin
  Result := FUserSU;
end;

procedure TAdvoPlex.LoadUserSU;
var
  reg: TRegistry;
begin
  reg := TRegistry.Create(KEY_READ);
  try
    reg.RootKey := HKEY_CURRENT_USER;
    if reg.OpenKeyReadOnly(ADVOPATH) then
    begin
      FUserSU := reg.ReadString('User');
      reg.CloseKey;
    end
    else
      raise Exception.CreateFmt('%s'+#13#10+'%s', ['Fehler beim Lesen von UserSU', SysErrorMessage(GetLastError)]);
  finally
    reg.Free;
  end;
end;

procedure TAdvoPlex.SaveUserSU;
var
  reg: TRegistry;
begin
  reg := TRegistry.Create(KEY_ALL_ACCESS);
  try
    reg.RootKey := HKEY_CURRENT_USER;
    if reg.OpenKey(ADVOPATH, True) then
    begin
      reg.WriteString('User', FUserSU);
      reg.CloseKey;
    end
    else
      raise Exception.CreateFmt('%s'+#13#10+'%s', ['Fehler beim Schreiben von UserSU', SysErrorMessage(GetLastError)]);
  finally
    reg.Free;
  end;
end;

procedure TAdvoPlex.SetUserSU(Value: string);
begin
  FUserSU := Value;
end;

function TAdvoPlex.CurrentUser: string;
var
  Buffer : array[0..MAX_PATH] of Char;
  Size : DWORD;
begin
  Size := SizeOf(Buffer);
  GetUserName(Buffer, Size);
  SetString(Result, Buffer, lstrlen(Buffer));
end;

end.
Und die Verwendung:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  AdvoPlex := TAdvoPlex.Create;
  try
    try
      AdvoPlex.LoadUserSU;
      ShowMessage(AdvoPlex.UserSu);
      AdvoPlex.UserSU := 'Test01';
      AdvoPlex.SaveUserSU;
    except
      on E: Exception do
        ShowMessage(e.Message);
    end;
  finally
    AdvoPlex.Free;
  end;
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#12

Re: Kapseln von Registryzugriffen

  Alt 21. Sep 2009, 16:31
Ich würde das ganz so realisieren:
Delphi-Quellcode:
unit AdvoPlex_Object;

interface

uses
  Windows,
  Classes,
  SysUtils,
  Registry;

const
  ADVOPATH = 'Software\AdvoSolutions\AdvoPlex';

type
  TAdvoPlex = class(TObject)
  private
    FUserSU: string;
    function CurrentUser: string;
    function GetUserSU: string;
    procedure SetUserSU(Value: string);
    procedure SaveUserSU;
    procedure LoadUserSU;
  public
    constructor Create;
    destructor Destroy; override;
  published
    property UserSU: string read GetUserSu write SetUserSU;
  end;

implementation

constructor TAdvoPlex.Create;
var
  reg: TRegistry;
begin
  inherited Create;
  reg := TRegistry.Create(KEY_ALL_ACCESS);
  reg.RootKey := HKEY_CURRENT_USER;
end;

destructor TAdvoPlex.Destroy;
begin
  FreeAndNil(reg);
  inherited Destroy;
end;

function TAdvoPlex.GetUserSU: string;
begin
  LoadUserSU;
  Result := FUserSU;
end;

procedure TAdvoPlex.LoadUserSU;
begin
  if reg.OpenKeyReadOnly(ADVOPATH) then
  begin
    FUserSU := reg.ReadString('User');
    reg.CloseKey;
  end
  else
    raise Exception.CreateFmt('%s'+#13#10+'%s', ['Fehler beim Lesen von UserSU', SysErrorMessage(GetLastError)]);
end;

procedure TAdvoPlex.SaveUserSU;
begin
  if reg.OpenKey(ADVOPATH, True) then
  begin
    reg.WriteString('User', FUserSU);
    reg.CloseKey;
  end
  else
    raise Exception.CreateFmt('%s'+#13#10+'%s', ['Fehler beim Schreiben von UserSU', SysErrorMessage(GetLastError)]);
end;

procedure TAdvoPlex.SetUserSU(Value: string);
begin
  FUserSU := Value;
  SaveUserSU;
end;

function TAdvoPlex.CurrentUser: string;
var
  Buffer : array[0..MAX_PATH] of Char;
  Size : DWORD;
begin
  Size := SizeOf(Buffer);
  GetUserName(Buffer, Size);
  SetString(Result, Buffer, lstrlen(Buffer));
end;

end.
Dadurch ersparst Du Dir zumindest das ständige Anlegen und Löschen der Registry-Instanzen.

Edit: Warum rufst Du LoadUserSU und SaveUserSU von Hand und nicht in SetUserSU und GetUserSU auf?
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#13

Re: Kapseln von Registryzugriffen

  Alt 21. Sep 2009, 16:37
Zitat von HeikoAdams:
Dadurch ersparst Du Dir zumindest das ständige Anlegen und Löschen der Registry-Instanzen.
und genau das dürfte die Intention des Threaderstellers gewesen sein.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Kapseln von Registryzugriffen

  Alt 21. Sep 2009, 17:22
Zuerst mal Danke für die vielen Code-Vorschläge. Ich kann mich garnicht entscheiden, was ich nehmen soll

Zitat von nahpets:
Hallo,
anliegend das ganze Projekt mit Exe zum Probieren.
@nahpets
Danke für die Mühen.
Also wenn die exe bei Dir funktioniert - wovon ich ausgehe - dann liegt es an meinem System (XP Prof. SP3). Wenn ich die bei mir aufrufe, bekomme ich denselben Fehler. Und das gleich auf 2 Rechnern

@HeikoAdams
Das mit der globalen TRegistry-Variable hatte ich ja zuerste probiert. Ich wollte das in eine ganz stinknormale Unit packen. Aber da kamen auch die Fehler und da dachte ich mir, mache ich es richtig(er). Leider bislang ohne Erfolg.

Zitat von Luckie:
Keine Ahnung woran es gelegen hat. Aber das Konzept war sowieso nicht schön...
@Luckie
Was bedeutet "gelegen hat"? Kam der Fehler bei Dir auch?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#15

Re: Kapseln von Registryzugriffen

  Alt 21. Sep 2009, 17:25
Zitat von HeikoAdams:
Delphi-Quellcode:
constructor TAdvoPlex.Create;
var
  reg: TRegistry; //lokale Variable
begin
  inherited Create;
  reg := TRegistry.Create(KEY_ALL_ACCESS); //Erzeugt und nie benutzt
  reg.RootKey := HKEY_CURRENT_USER;
end;

destructor TAdvoPlex.Destroy;
begin
  FreeAndNil(reg); //welches reg?
  inherited Destroy;
end;
Das dürfte so wohl nicht funktionieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#16

Re: Kapseln von Registryzugriffen

  Alt 21. Sep 2009, 18:35
Hallo,
Zitat von Schwedenbitter:
Also wenn die exe bei Dir funktioniert - wovon ich ausgehe - dann liegt es an meinem System (XP Prof. SP3). Wenn ich die bei mir aufrufe, bekomme ich denselben Fehler. Und das gleich auf 2 Rechnern
dann können es eigentlich nur noch Rechteprobleme sein.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Kapseln von Registryzugriffen

  Alt 21. Sep 2009, 20:26
Zitat von nahpets:
Hallo,
Zitat von Schwedenbitter:
Also wenn die exe bei Dir funktioniert - wovon ich ausgehe - dann liegt es an meinem System (XP Prof. SP3). Wenn ich die bei mir aufrufe, bekomme ich denselben Fehler. Und das gleich auf 2 Rechnern
dann können es eigentlich nur noch Rechteprobleme sein.
Leider ausgeschlossen:
(1) Ich mache das, was man nicht tun sollte: Bin stets als Admin angemeldet.
(2) Ich habe jetzt mangels Geduld angefangen, die Set-/Get-Procedures so zu schreiben, dass in jeder einzelnen TRegistry angelegt, bearbeitet etc. wird und es klappt.
(3) Wenn es Rechteprobleme wären, sähe die Fehlermeldung anders aus.

Ich danke trotzdem für Eure sehr ausführliche Hilfe.

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#18

Re: Kapseln von Registryzugriffen

  Alt 21. Sep 2009, 21:19
Ich bekam immer eine Exception beim Lesen aus der Registry. Deswegen habe ich aus dem globalen Registry Objekt ein lokales gemacht, dann ging es auf einmal. Das hat auch noch den Vorteil, dass die Registry auch nur lesend geöffnet wird, wenn ich auch nur lesen will. Bei Heiko ist die Registry jetzt die ganze Zeit über mit vollen Rechten geöffnet. Bei HKCU kein Problem, aber bei anderen Schlüsseln eventuell.

Und ich rufe SaveUserSU und LoadUserSU nicht im Getter und Setter auf, damit der Benutzer der Klasse entscheiden kann, wann geschrieben und wann gelesen werden soll. Desweiteren gehört so was in einen Getter und Setter nicht rein. Diese Methoden sind dazu da Attribute der Klasse zusetzen und auszulesen. Wenn ich einen Setter aufrufe, rechne ich nicht damit, dass der irgendwas in meinem System rumschreibt.

Ich hatte also schon meine Gründe für meine Lösung.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Kapseln von Registryzugriffen

  Alt 21. Sep 2009, 21:49
Zitat von Luckie:
Ich hatte also schon meine Gründe für meine Lösung.
Die stimmen natürlich.

Nur ist TAdvoPlex ausschließlich für mich. Es gibt 5 Programmmodule, die alle Ihre Daten aus der Registry von denselben Schlüsseln holen und dorthin schreiben. Bislang eine wahnsinns Durcheinander. Der Suffix bei z.B. UserSU kommt als Anlehung aus Linux (=SuperUser). Nur der Admin kann mit einem Setup-Programm in HKEY_LOCAL_MACHINE schreiben. Die anderen dürfen nur lesen. Sie sollen aber diese Werte geringfügig abändern und eben unter HKEY_CURRENT_USER abspeichern dürfen. Sie haben nur ein Mini-Setup, in dem aber die Werte beider Schlüssel verglichen werden. Dort gibt es auch für jeden Eintrag ein Button "Default", wobei Default die Werte von HKEY_LOCAL_MACHINE sind.

Wenn ich nun z.B. nur bei User auf Default klicke, macht es daher - vielleicht auch nur bei mir - Sinn, es gleich in die Registry zu schreiben. Es macht mir sonst einfach zuviel Aufwand mit entsprechenden Variablen in den jeweiligen Programmmodulen auf Änderungen zu prüfen etc. pp. Ich hoffe, das versteht jemand einigermaßen
Was ich damit nur sagen wollte: Somit hatte ich für meine Lösung auch Gründe Es kommt hinzu, dass ich ja - meistens - weiß, was ich tue (in die Registry schreiben).

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#20

Re: Kapseln von Registryzugriffen

  Alt 21. Sep 2009, 21:54
Ich finde es einfach nur nicht sauber, wenn Routinen nicht das machen, wofür sie gedacht sind. Und ein Setter macht für mich nun mal nichts anderes als das zugehörige Attribut setzen.

Aber OK, ist deine Entscheidung. Allerdings sollte Faulheit nie dazu führen deswegen schlechten Code zu schreiben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 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