AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) TRegistry Unterschied zwischen Delphi 7 und 2009
Thema durchsuchen
Ansicht
Themen-Optionen

TRegistry Unterschied zwischen Delphi 7 und 2009

Ein Thema von Shark99 · begonnen am 6. Mai 2015 · letzter Beitrag vom 11. Mai 2015
Antwort Antwort
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

TRegistry Unterschied zwischen Delphi 7 und 2009

  Alt 6. Mai 2015, 07:36
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.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

AW: TRegistry Unterschied zwischen Delphi 7 und 2009

  Alt 6. Mai 2015, 07:44
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;
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#3

AW: TRegistry Unterschied zwischen Delphi 7 und 2009

  Alt 6. Mai 2015, 07:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.360 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TRegistry Unterschied zwischen Delphi 7 und 2009

  Alt 6. Mai 2015, 08:34
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TRegistry Unterschied zwischen Delphi 7 und 2009

  Alt 6. Mai 2015, 09:26
Nimm mal beim Pfad das führende Backslahs weg. Also Statt '\Software\Vendor\Productname' -> 'Software\Vendor\Productname'
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: TRegistry Unterschied zwischen Delphi 7 und 2009

  Alt 6. Mai 2015, 11:01
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.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#7

AW: TRegistry Unterschied zwischen Delphi 7 und 2009

  Alt 6. Mai 2015, 16:22
Nimm mal beim Pfad das führende Backslahs weg. Also Statt '\Software\Vendor\Productname' -> 'Software\Vendor\Productname'
Daran lag es nicht. Macht auch keinen Sinn, weil \ am Anfang die direkte Addressierung ist (kein Close des Keys zuvor notwendig). Ohne \ am Anfang ist der Key immer relativ zum gerade offenen Key (schon seit Delphi 3 und Windows 95).

Ich denke es liegt an was anderen. Ich hab auf der Kiste neben Delphi 7 und Delphi 2009 (Vollversionen) auch Delphi XE8 (30 Tage Trial). Kompiliere ich die Exe unter Delphi 7 und starte mit dem Explorer startet sie ohne Probleme. Aber sowohl unter 2009 als auch unter XE8 wenn ich die Exe über den Explorer starte kommt zuerst die Meldung 'The publisher could not be verified', was man sonst kennt wenn man eine Exe von einem Netzlaufwerk startet. Es ist aber hier alles lokal und zwar für alle 3 in c:\projects. Kopiere ich die Exes die von 2009 und XE8 erzeugt wurden woanders hin kommt die Meldung nicht mehr. Windows 7 mag also die von 2009 und XE8 erzeugten Exes nicht besonders und schränkt den Schreibzugriff auf die Registry, allerdings nur in dem Verzeichnis in dem sie kompiliert wurden.

Um die Theorie zu testen habe ich den Code leicht geändert:
Delphi-Quellcode:
FRegistry := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY);
FRegistry.RootKey := HKEY_CURRENT_USER;
if FRegistry.OpenKey('\Software\Vendor\Productname', True) then
begin
   ShowMessage('ok');
end else
begin
   ShowMessage('not ok');
end;
Ergebnis:

Start aus c:\projects\project1: not ok
Nach Kopieren der Exe-Datei nach c:\test: ok

Also habe ich das Projekt nach c:\test\project1 verschoben. Starten -> ok. Wenn ich jedoch einen Rebuild mache und starte -> not ok.

Sehr sehr merkwürdige Sache. Ich denke es liegt irgendwie an meinem System. Ich verstehe aber nicht wieso die Exe wenn sie mit Delphi 7 kompiliert wird keinerlei Probleme macht. Vielleicht erkennt Windows 7 dass die Exe dann von einem Compiler ist der von der Era von vor Windows 7 stammt und gibt der Exe dann automatisch mehr Rechte (Kompatibilitätsmodus).

Trotzdem ist es extrem merkwürdig weil ich als Admin eingelogt bin und UAC komplett aus ist. 'Run as Administrator' ändert an der Sache nichts.

Bin wirklich mit meinem Latein am Ende.
  Mit Zitat antworten Zitat
Antwort Antwort


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:13 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