![]() |
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?
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
Die meisten Programme werden im Laufe der Zeit erweitert und damit werden dann auch z.B. mehr Einstellungen usw. benötigt. Da ist es viel besser, wenn man gleich TRegistry benutzt hat und damit auch die Möglichkeit hat die Möglichkeiten der Registry auszuschöpfen. Davon abgesehen sehe ich aber auch nicht den großen Unterschied im Quelltext, nur dass du bei TRegIniFile keinerlei Möglichkeit zur Fehlerbehandlung hast, da du nirgends den Rückgabewert von OpenKey im Konstruktor bekommst. Du weißt also nicht, ob du hinterher überhaupt schreiben kannst, kannst also nur auf eine Exception prüfen (oder CurrentPath gegenprüfen, aber naja)... |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
@jaenicke
Wenn du dir TRegIniFile genauer ansiehst, wirst du bemerken, dass es auf HKEY_CURRENT_USER beschränkt ist. Mit TRegIniFile kann man also nicht irgendwo anders schreiben, nur in HKEY_CURRENT_USER Zweig. Das ist die Einschränkung. Und auf HKEY_CURRENT_USER hat man in der Regel immer Rechte, da es dem CURRENT_USER, als dem aktuellen Benutzer gehört. Man greift also auf den eigenen Zweig der Registry zu. Somit sollte es keine Probleme geben. Die Probleme die du meinst tauchen in der Regel in anderen Zweigen auf. Ich könnte mir nur den einen Grund vorstellen, dass ein anderes Programm auf meine Einstellungen zugreift, was eigentlich nicht vorkommen sollt. Also nochmal, allgemein auf die Registry zugreifen, da gebe ich dir Recht. Hier gehen es aber um HKEY_CURRENT_USER. |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
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:
Ergebnis:
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; 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. :roll: |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Schau mal genauer in folgende Registry-Zweige:
Code:
ob dort deine EXE oder ähnliches mit Hinweis auf selbige auftaucht. Prüfe außerdem, ob die EXE an sich im Kompatibilitätsmodus läuft (Rechtsklick > Eigenschaften).
HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags
HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AppCompatFlags MfG Dalai |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Dalai, Danke für die Hinweise.
Im Kompabilitätsmodus (Windows XP3) direkt aus dem Projektverzeichnis kommt zwar OK, d.h. der Key wird gelesen, aber die App crasht dann sobald ein Schreibzugriff auf die Registry kommt (nach Umkopieren OK und kein Crash). Die Registry Keys werde ich gleich überprüfen. |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Habe alle AppCompatFlags Registry keys (inkl Subkeys) durchgeschaut, nichts dort zeigt auf die Exe oder c:\projects.
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
Zitat:
vielleicht helfen Dir die Links weiter: ![]() ![]() Gruß K-H |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
Kann es sein, dass du irgendeinen Virenscanner oder Internet Security verwendest, die da blockieren könnte? Testweise mal abschalten. MfG Dalai |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Da ich derzeit Showmessage im Code habe spielen die Exceptions erstmals keine Rolle. Bei den Schreibzugriffen später (beim Beenden der ab) habe ich Try/Except blocks und die werden ausgelöst gefolgt vom Runtime Error 204.
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
Virenscanner (Nod32) habe ich natürlich Testweise schon abgeschaltet ohne Änderung. |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Noch eine andere Sache: Verwendest du ein Manifest? Wenn ja, wie sieht das aus? Gibt es Unterschiede in den Manifesten der unterschiedlichen Delphis?
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Verwende für das Projekt kein Manifest, weil die App keinerlei aussergewöhnliche Rechte braucht (Registry immer nur CURRENT_USER).
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Hab nun Testweise die Exe direkt im Projektverzeichnis digital signiert. Brachte leider keine Besserung.
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
[EDIT] Wie heißt die EXE und in welchem Pfad liegt sie? Ich hatte selber mal ein Problem mit dem Kompatibilitätsmodus, der automatisch auf meine EXE angewendet wurde, vielleicht ist das hier auch der Fall. MfG Dalai |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
Aber mal was anderes wie sieht's denn mit dem Manifest aus? Gruß K-H |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
Ich habe aber etwas neues entdeckt!! Wenn ich ein neues Verzeichnis anlege c:\delphitest, dorthin das projekt nach c:\delphitest\projektname kopiere und von dort kompiliere tritt der Fehler auf (also nicht OK). Wenn ich jedoch statt dessen in ein Verzeichnis kopiere welches schon vor langer Zeit angelegt wurde (getestet mit c:\temp und c:\a), so dass es in c:\a\projektname liegt kann ich dort kompilieren wie ich lustig bin und es kommen keine Fehler (immer ein OK und Schreibzugriffe funktionieren). In anderen Worten mit meinem ArbeitsPC ist neulich was passiert dass die Zugriffsrechte in neu erstellten Verzeichnissen nicht mehr passen. Das ganze aber nur auf c:\ Wenn ich den ganzen Rotz von c:\ nach d:\ kopiere (D ist eine andere Partition auf der gleichen SSD) funktioniert alles wunderbar. Ich mache mit PCs seit 25 Jahren rum, aber sowas habe ich noch nie erlebt (deshalb hilft ja Google nicht). |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Neuere Delphi erstellen das Manifest aus Daten in der DPROJ neu, wobei praktisch die komplette RES neu generiert wird, also durch Löschen der RES ändert sich nichts.
Neben dem Manifest hat sich auch Einiges am PE-Header geändert. PS: ![]() |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
![]() Gib einfach einmal TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY); bei Google ein, da kommt massenweise Lesestoff. Ob eine Lösung dabei ist, kann ich Dir leider nicht garantieren. |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
Zitat:
![]() MfG Dalai |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
Ich denke also es ist kein Delphi-Problem per SE, sondern es ist mit meinem ArbeitsPC etwas nicht in Ordnung (Richtlinien oder Registry) und alle neu angelegten Verzeichnisse auf c:\ haben stark eingeschränkte Rechte (d:\ hat das Problem nicht). |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
Zitat:
Aber da du gerade nochmal die Geschichte mit den Pfaden erwähnst, fällt mir etwas ein: Die Sache mit dem "Publisher not verified" kommt direkt vom IE bzw. dessen Sicherheitszonen. Vielleicht hat sie doch etwas damit zu tun, weil evtl. (Programme aus) bestimmte(n) Zonen keine Rechte haben, auf bestimmte Registry-Zweige zuzugreifen - kann ich mir jedenfalls vorstellen. Schau mal in der Systemsteuerung > Internetoptionen > Register Sicherheit, ob unter Eingeschränkte Sites etwas eingetragen ist. Ggf. hilft es auch, die Zonen alle auf Standard zurückzustellen (Button unten in der genannten Registerkarte). MfG Dalai |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Hab alle Zonen resettet (+Reboot). Hat leider nichts gebracht.
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Schau dir mal die NTFS ADS der problematischen Dateien und Verzeichnisse an. Das geht z.B. mit
![]() MfG Dalai |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Eine kleine Bitte. Teste mal die drei Zeilen
Delphi-Quellcode:
Hier übernimmt im Grunde Delphi das Drumherum und öffnet die Keys. Ist es eine Frage der Rechte, dürfte der Dreizeiler nichts in den Pfad schreiben. Denn ob du keine Rechte bekommst oder der Dreizeiler, ist ja das Gleiche. Schreibt er hingegen etwas in den Pfad rein, weißt du, dass der Fehler im Code liegt.
with TRegIniFile.Create('Software\Vendor\Productname') do try
WriteString('', 'Test', 'Testwert'); finally Free end; Bei der Gelegenheit würde ich gerne die Frage stellen ob du evtl. schon vorher, also vor den Zeilen einmal auf die Registry zugegriffen hast? Das ist nicht unwichtig. Ich kann mich nicht mehr genau dran erinnern woran es lag, ich glaube es lag an fehlendem CloseKey, da hatte ich ein ähnliches Problem. Damals habe ich irgendwo in der Hilfe gelesen (das finde ich jetzt nicht mehr), dass es sehr wichtig ist, dass der Schlüssel wieder geschlossen wird, weil sonst... irgendwas nicht richtig funktionieren wird. Wie gesagt, ich finde die Zeilen jetzt nicht wieder. Aber wichtig für dich ist - schließt du auch immer schön den Schlüssel wieder? EDIT: Der Ablauf sollte in etwas so aussehen:
Delphi-Quellcode:
var
Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey('\Software\Usw', True) then begin Reg.WriteString('Bla','Blabla'); Reg.CloseKey; //wird gerne vergessen end; finally Reg.Free; end; end; |
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
|
AW: TRegistry Unterschied zwischen Delphi 7 und 2009
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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-2025 by Thomas Breitkreuz