![]() |
Re: Kapseln von Registryzugriffen
Keine Ahnung woran es gelegen hat. Aber das Konzept war sowieso nicht schön. Hier mal meine Version:
Delphi-Quellcode:
Und die Verwendung:
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.
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; |
Re: Kapseln von Registryzugriffen
Ich würde das ganz so realisieren:
Delphi-Quellcode:
Dadurch ersparst Du Dir zumindest das ständige Anlegen und Löschen der Registry-Instanzen.
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. Edit: Warum rufst Du LoadUserSU und SaveUserSU von Hand und nicht in SetUserSU und GetUserSU auf? |
Re: Kapseln von Registryzugriffen
Zitat:
|
Re: Kapseln von Registryzugriffen
Zuerst mal Danke für die vielen Code-Vorschläge. Ich kann mich garnicht entscheiden, was ich nehmen soll :mrgreen:
Zitat:
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 :gruebel: @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:
Was bedeutet "gelegen hat"? Kam der Fehler bei Dir auch? Gruß, Alex |
Re: Kapseln von Registryzugriffen
Zitat:
|
Re: Kapseln von Registryzugriffen
Hallo,
Zitat:
|
Re: Kapseln von Registryzugriffen
Zitat:
(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 |
Re: Kapseln von Registryzugriffen
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. ;) |
Re: Kapseln von Registryzugriffen
Zitat:
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 :pale: Was ich damit nur sagen wollte: Somit hatte ich für meine Lösung auch Gründe :mrgreen: Es kommt hinzu, dass ich ja - meistens - weiß, was ich tue (in die Registry schreiben). Gruß, Alex |
Re: Kapseln von Registryzugriffen
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 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 by Thomas Breitkreuz