![]() |
Debugger von Delphi XE x lügt
Hallo zusammen.
Konnte dazu hier sonst nichts finden, vielleicht kennt der ein oder andere das Problem aber auch. Der Debugger von Delphi XE x (habs mit XE2 und XE7 getestet) lügt, zumindest beim Arbeiten mit der Registry. Folgendes Testprogramm: -Neue Anwendung mit einem Button und einem Memo
Delphi-Quellcode:
Zum Testen muss es die Registryschlüssel geben und ggf. im letzten Schlüssel muss es Werte geben.
uses
.... System.Win.Registry ... ..... procedure TForm5.Button1Click(Sender: TObject); var Reg : TRegistry; begin Reg := TRegistry.Create(KEY_READ); Reg.RootKey := HKEY_CURRENT_USER; try OutputDebugString(pchar('Key Exists ist ' + BooltoStr(reg.KeyExists('Ein bestehender Schlüssel X'),true))); if reg.KeyExists('Wieder Schlüssel X') then begin Reg.OpenKey(Schlüssel X,false); OutputDebugString(pchar('Key Exists ist ' + BooltoStr(reg.KeyExists(Schlüssel Y unterhalb von Schlüssel X),true))); if reg.KeyExists(Wieder der Schlüssel Y) then begin Reg.OpenKey(Schlüssel Y,false); Reg.GetValueNames(Memo1.Lines); end; end; finally Reg.CloseKey; Reg.Free; end; end; Die Namen der Werte landen dann im Memo. Bei Delphi 2007 liefert OutpuDebugString jeweils True und wir laufen auch in die IF-Blöcke rein Wenn ich "reg.KeyExists ....." mittel Strg+F7 untersuche sagt mir Delphi auch das es true ist. Alles wunderbar. Wenn ich das gleiche in XE2 und XE7 mache stimmt der Outputdebugstring auch. Wir kommen auch in die IF-Blöcke. Der Code läuft also zumindest mal richtig. Wenn ich "reg.keyexists ...." allerdings auswerte sagt mit Delphi doch tatsächlich das es "False" wäre. Hat jemand schonmal ähnliche Probleme gehabt ? |
AW: Debugger von Delphi XE x lügt
Sicher dass du KeyExists nicht NACH dem OpenKey auswertest?
|
AW: Debugger von Delphi XE x lügt
Ja. Habs gerade nochmal getestet.
Haben das Problem auch an allen Entwicklungsrechnern (> 5 Stück). Wenn man das ganze auf TRegIniFile umstellt ist es auch lustig. Wenn man z.B. einen existierenden Wert auslesen will und macht sowas hier
Delphi-Quellcode:
Hat X den korrekten Wert aus der Reg.
x := Reg.ReadInteger(Section, Value, 0);
Werte ich ich Reg.ReadInteger aus bekomme ich immer 0 bzw den Wert den ich als Default als letzten Parameter angebe. Als würde der Debugger nicht an die Registry kommen. |
AW: Debugger von Delphi XE x lügt
Liste der Anhänge anzeigen (Anzahl: 1)
Ich will dir ja nicht unterstellen dich im Debugger zu vertippen aber ich kann kein Fehlverhalten feststellen. Siehe angehängtes Bild: Wie erwartet ist die erste Auswertung True, die zweite False. Nach dem ersten OpenKey dreht es sich um.
Delphi-Quellcode:
program Project23;
{$APPTYPE CONSOLE} uses System.SysUtils, System.Win.Registry, System.Classes, Winapi.Windows; procedure registryAccess(); const registryPath: String = 'Software\Günthersoft\meinProgramm'; registrySubPath: String = 'mySection'; var Reg : TRegistry; valueNames: TStrings; valueName: String; begin Reg := TRegistry.Create(KEY_READ); Reg.RootKey := HKEY_CURRENT_USER; try OutputDebugString(PChar( 'Key Exists ist ' + BooltoStr(Reg.KeyExists(registryPath), true) )); if Reg.KeyExists(registryPath) then begin Reg.OpenKey(registryPath, false); OutputDebugString(PChar( 'Key Exists ist ' + BooltoStr(Reg.KeyExists(registrySubPath), true) )); if Reg.KeyExists(registrySubPath) then begin Reg.OpenKey(registrySubPath, false); valueNames := TStringList.Create(); try Reg.GetValueNames(valueNames); for valueName in valueNames do WriteLn(valueName); finally valueNames.Destroy(); end; end; end; Reg.CloseKey(); finally Reg.Destroy(); end; end; begin try registryAccess(); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; WriteLn(slineBreak,'Ende'); readln; end. |
AW: Debugger von Delphi XE x lügt
Zitat:
Delphi-Quellcode:
:roll:
const registryPath: String = '\Software\Günthersoft\meinProgramm';
Aus gutem Grund musstest du in der Auswertung erst aktivieren, daß du "Veränderungen" zulassen willst. Zitat:
|
AW: Debugger von Delphi XE x lügt
Ich kenne nur "Seiteneffekte und Funktionsaufrufe zulassen". Hätte er das nicht angemacht dürfte er im Debugger gar nichts ("Nicht verfügbarer Wert") sehen.
|
AW: Debugger von Delphi XE x lügt
Genau das.
Delphi kann hier nicht "prüfen", ob in dem Funktionsaufruf etwas verändert wird ... grundsätzlich kann das passieren, also ist es standardmäßig aus. PS: Einmal ohne Debugger ausführen und dann nochmal im Debugger (Haltpunkt + F8), mit DoCount in den überwachten Ausdrücken (Mal mit und mal ohne Seiteneffekte).
Delphi-Quellcode:
type
TForm1 = class(TForm) ... procedure FormCreate(Sender: TObject); private FCount: Integer; function DoCount: Integer; end; function TForm1.DoCount: Integer; begin Inc(FCount); Result := FCount; end; procedure TForm1.FormCreate(Sender: TObject); begin FCount := 0; // <<< Haltepunkt und dann weiter mit F8 ShowMessage(IntToStr(DoCount)); ShowMessage(IntToStr(DoCount)); ShowMessage(IntToStr(DoCount)); end; |
AW: Debugger von Delphi XE x lügt
Hallo..
.. und noch nen kleiner Tip beim Arbeiten mit der Reg: Vorsicht, wenn Du mit 32Bit Programmen auf 64Bit Windows-OS arbeitest. Es gibt da leider die WoW64 Umleitung... Somit kann es sein, das Regedit (unter 64bit OS auch 64bit) den Wert im richtigen Pfad anzeigt, jedoch dein Programm behauptet, das der Key nicht vorhanden ist, da der Pfad einer 32bit Applikation von MS umgebogen wird. Das ist gerade dann notwendig zu berücksichtigen, wenn man Konfigurationen von Windows verändern will. |
AW: Debugger von Delphi XE x lügt
Sorry für die späte Antwort. War letzte Woche Schachmatt.
Hab gerade nochmal getestet. "Seiteneffekte und Funktionsaufrufe zulassen" ist bei mir aus. Mach ichs an, ändert sich bei mir an dem Verhalten auch nix. Allerdings macht es beim Debugger wohl nen Unterschied ob man den Schlüssel mit führendem \ angibt oder nicht. Mit führendem \ liefert die Debugger das richtige Ergebnis, ohne \ kommt immer false. Die IF-Anweisung ohne \ verhält sich aber richtig. |
AW: Debugger von Delphi XE x lügt
Hast du denn auch verstanden was der "\" macht?
relative Pfadangabe <> absolute Pfadangabe Und schon erklört es, warum sich das so verhält. Genau aus dem selben Grund soll man im Dateisystem auch niemals relative Pfade benutzen ... nur bei der Registry versteht das wieder mal Keiner :roll:
Delphi-Quellcode:
Reg.OpenKey('Software\Günthersoft\meinProgramm', false)
= Reg.OpenKey('Software', false) Reg.OpenKey('Günthersoft', false) Reg.OpenKey('meinProgramm', false) und Reg.OpenKey('Software\Günthersoft\meinProgramm', false) Reg.OpenKey('Software\Günthersoft\meinProgramm', false) = Reg.OpenKey('Software\Günthersoft\meinProgramm\Software\Günthersoft\meinProgramm', false) // und das existiert ja wohl nicht oder Reg.OpenKey('Software\Günthersoft\meinProgramm', false) Reg.OpenKey('Software\Günthersoft\meinProgramm', false) Reg.OpenKey('Software\Günthersoft\meinProgramm', false) = Reg.OpenKey('Software\Günthersoft\meinProgramm\Software\Günthersoft\meinProgramm\Software\Günthersoft\meinProgramm', false) usw. aber Reg.OpenKey('\Software\Günthersoft\meinProgramm', false) Reg.OpenKey('\Software\Günthersoft\meinProgramm', false) = Reg.OpenKey('\Software\Günthersoft\meinProgramm', false) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 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