TRegistry Unterschied zwischen Delphi 7 und 2009
Hallo!
ich bin dabei ein Projekt von Delphi 7 auf Delphi 2009 umzuschreiben. Es crasht und ich merkte es liegt am Zugriff bei TRegistry. Der Code ist sehr einfach:
Delphi-Quellcode:
Das Klappt unter Delphi 7 wunderbar (Exe funktioniert unter Win 7 x64 und Win 8.1 x64, und zwar auch ohne Admin-Rechte). Der Key ist schon vorhanden und wird geöffnet. Wenn ich jedoch mit Delphi 2009 kompiliere und ausführe wird der Key nicht geöffnet, sondern der Code bei // Fehler ausgeführt.
FRegistry := TRegistry.Create;
FRegistry.RootKey := HKEY_CURRENT_USER; if FRegistry.OpenKey('\Software\Vendor\Productname', True) then begin // Alles OK, Key war schon da, oder wurde erstellt ... end else begin // Fehler ... end; Wenn ich nun Testweise TRegistry.Create mit TRegistry.Create(KEY_READ) ersetze wird der Key hingegen geöffnet. Das Problem ist aber leider nicht gelöst, weil das FRegistry Objekt diesen Key nicht nur ausliest, sondern beim Programmbeenden auch beschreibt. Wie sind die TRegistry.Create() Parameter damit ich HKEY_CURRENT_USER sowohl lesen, als auch beschreiben kann? Ich versuchte es kurz mit KEY_ALL_ACCESS versucht. Key wird damit nichtmal geöffnet (wieso nicht?). Als nächstes KEY_READ or KEY_WRITE, Key wird auch nicht geöffnet. Neuer versuch: KEY_READ AND KEY_WRITE, Key wird geöffnet, aber der danach versuchte ReadBool() liefert ein falsches Ergebnis (mit nur KEY_READ das Richtige). Bin leider mit meinem Latein am Ende. :oops: |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Ist das, was in der Online-Hilfe steht, nicht hilfreich?
Delphi-Quellcode:
Mit Create wird ein TRegistry-Objekt instantiiert. Dabei erhält die Eigenschaft RootKey den Wert HKEY_CURRENT_USER und die Eigenschaft LazyWrite den Wert true. Wenn der Parameter AAccess übergeben wird, wird dessen Wert für die Initialisierung der Eigenschaft Access verwendet. Ansonsten wird Access mit KEY_ALL_ACCESS initialsiert.
constructor Create; overload;
constructor Create(AAccess: LongWord); overload;
Delphi-Quellcode:
{
This example shows how to use the TRegistry class in order to find, insert and delete Keys and Items into the Windows Registry. This example uses two buttons: InsertToRegBtn and DeleteFromRegBtn, on a form, for inserting and deleting the values. } procedure TForm3.InsertToRegBtnClick(Sender: TObject); var reg : TRegistry; openResult : Boolean; today : TDateTime; begin reg := TRegistry.Create(KEY_READ); reg.RootKey := HKEY_LOCAL_MACHINE; if (not reg.KeyExists('Software\\MyCompanyName\\MyApplication\\')) then begin MessageDlg('Key not found! Created now.', mtInformation, mbOKCancel, 0); end; reg.Access := KEY_WRITE; openResult := reg.OpenKey('Software\\MyCompanyName\\MyApplication\\',True); if not openResult = True then begin MessageDlg('Unable to create key! Exiting.', mtError, mbOKCancel, 0); Exit(); end; {checking if the values exist and inserting when neccesary} if not reg.KeyExists('Creation\ Date') then begin today := Now; reg.WriteDateTime('Creation\ Date', today); end; if not reg.KeyExists('Licenced\ To') then begin reg.WriteString('Licenced\ To', 'MySurname\ MyFirstName'); end; if not reg.KeyExists('App\ Location') then begin reg.WriteExpandString('App\ Location', '%PROGRAMFILES%\\MyCompanyName\\MyApplication\\'); end; if not reg.KeyExists('Projects\ Location') then begin reg.WriteExpandString('Projects\ Location', '%USERPROFILE%\\MyApplication\\Projects\\'); end; reg.CloseKey(); end; procedure TForm3.DeleteFromRegBtnClick(Sender: TObject); var reg : TRegistry; begin reg := TRegistry.Create(KEY_WRITE); reg.RootKey := HKEY_LOCAL_MACHINE; reg.DeleteKey('Software\\MyCompanyName\\MyApplication'); reg.DeleteKey('Software\\MyCompanyName'); reg.CloseKey(); end; |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Perlsau, nein das hilft nicht.
Es geht hier um Code der sich Unter Delphi 7 und Delphi 2009 komplett anders verhält. Die Hilfe sagt kein Wort wieso KEY_READ OR KEY_WRITE bzw KEY_ALL_ACCESS in Verbindung mit HKEY_CURRENT_USER gar nicht funktioniert. |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Ich würde einmal mit dem Process Monitor schauen was eigentlich passiert im Vergleich. Den Filter solltest du auf "Process Name is <Name deiner Exe>" setzen und zudem "Operation begins with Reg". Dann solltest du recht schnell sehen was passiert.
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Nimm mal beim Pfad das führende Backslahs weg. Also Statt '\Software\Vendor\Productname' -> 'Software\Vendor\Productname'
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Ich weiß, vielleicht wird das etwas OT, aber ich hab nie verstanden was so toll daran sein soll auf HKEY_CURRENT_USER, bzw. speziell auf "Software" über die TRegistry zuzugreifen, falls man nur 08/15 Daten drauf ablegen will. Nur um eine String abzuspeichern verbiegen sich einige mit dem Rattenschwanz an Zeilen, dabei bietet Delphi einen einfachen Zugriff. Solange es HKEY_CURRENT_USER ist.
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Wenn du damit auf TRegIniFile hinaus willst:
Das ist nur eine Krücke um eine Migration der alten INIs von Windows 3.x auf Windows 9x und höher einfacher zu machen. Für neue Implementierungen macht es normalerweise keinen Sinn, weil man sich damit unnötig beschränkt, es damit aber nicht einfacher ist (wenn nicht schon INI-Code da ist). |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Wo beschränkt man sich? Wenn ich keine Großfamilie habe, dann kaufe ich mir auch nicht einen Kleinbus, weil da zehn Personen rein passen, ich also mehr Möglichkeiten habe. Natürlich ist/war TRegIniFile dazu gedacht einfach seine Ini umzuschreiben, aber was ist gegen
Delphi-Quellcode:
zu sagen, wenn man einen String speichern möchte?
with TRegIniFile.Create('Software\' + ChangeFileExt(ExtractFileName(ParamStr(0)), '')) do
try WriteString(Section, Ident, 'Irgendein Text') finally Free end; Ist es cooler für das gleiche Ergebnis doppelt so viele Zeilen zu nutzen, weil es TRegistry ist? Ja, wenn ich mehr speichern will, nutze ich auch TRegistry. Um Einstellungen zu speichern, da verbiege ich mich nicht künstlich, nur weil in der Hilfe steht, dass es für die Migration der alten INIs von Windows 3.x auf Windows 9x ist. Es ist da, es reicht für 98% alle Fälle, warum also mehr? |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Und wo ist da der große Unterschied zu dem?
Delphi-Quellcode:
Abgesehn daon, daß bei Beidem die Fehlerbehandlung fehlt.
with TRegistry.Create(KEY_WRITE) do
try OpenKey('Software\MeineFirma\MeinProgramm\' + Section, True); WriteString(Ident, 'Irgendein Text'); finally Free; end; |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Hast du jetzt geantwortet um nur um zu antworten oder war es ernst gemeint?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 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