Delphi-PRAXiS
Seite 1 von 10  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   TRegistry Unterschied zwischen Delphi 7 und 2009 (https://www.delphipraxis.net/184986-tregistry-unterschied-zwischen-delphi-7-und-2009-a.html)

Shark99 6. Mai 2015 07:36

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:
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;
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.

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:

Perlsau 6. Mai 2015 07:44

AW: TRegistry Unterschied zwischen Delphi 7 und 2009
 
Ist das, was in der Online-Hilfe steht, nicht hilfreich?
Delphi-Quellcode:
constructor Create; overload;
constructor Create(AAccess: LongWord); overload;
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.
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;

Shark99 6. Mai 2015 07:47

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.

jaenicke 6. Mai 2015 08:34

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.

Bernhard Geyer 6. Mai 2015 09:26

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'

Popov 6. Mai 2015 11:01

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.

jaenicke 6. Mai 2015 13:11

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).

Popov 6. Mai 2015 13:38

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:
  with TRegIniFile.Create('Software\' + ChangeFileExt(ExtractFileName(ParamStr(0)), '')) do
  try
    WriteString(Section, Ident, 'Irgendein Text')
  finally
    Free
  end;
zu sagen, wenn man einen String speichern möchte?

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?

himitsu 6. Mai 2015 13:51

AW: TRegistry Unterschied zwischen Delphi 7 und 2009
 
Und wo ist da der große Unterschied zu dem?
Delphi-Quellcode:
with TRegistry.Create(KEY_WRITE) do
try
  OpenKey('Software\MeineFirma\MeinProgramm\' + Section, True);
  WriteString(Ident, 'Irgendein Text');
finally
  Free;
end;
Abgesehn daon, daß bei Beidem die Fehlerbehandlung fehlt.

Popov 6. Mai 2015 14:43

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.
Seite 1 von 10  1 23     Letzte »    

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