Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Debugger von Delphi XE x lügt (https://www.delphipraxis.net/184271-debugger-von-delphi-xe-x-luegt.html)

wadriller 13. Mär 2015 14:10

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:
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;
Zum Testen muss es die Registryschlüssel geben und ggf. im letzten Schlüssel muss es Werte geben.
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 ?

Der schöne Günther 13. Mär 2015 15:14

AW: Debugger von Delphi XE x lügt
 
Sicher dass du KeyExists nicht NACH dem OpenKey auswertest?

wadriller 13. Mär 2015 15:32

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:
x := Reg.ReadInteger(Section, Value, 0);
Hat X den korrekten Wert aus der Reg.
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.

Der schöne Günther 13. Mär 2015 16:29

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.

himitsu 13. Mär 2015 18:20

AW: Debugger von Delphi XE x lügt
 
Zitat:

Delphi-Quellcode:
const registryPath: String = 'Software\Günthersoft\meinProgramm';

Delphi-Quellcode:
const registryPath: String = '\Software\Günthersoft\meinProgramm';
:roll:

Aus gutem Grund musstest du in der Auswertung erst aktivieren, daß du "Veränderungen" zulassen willst.



Zitat:

Wer misst misst Mist.

Der schöne Günther 13. Mär 2015 18:27

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.

himitsu 13. Mär 2015 18:36

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;

HolgerX 13. Mär 2015 19:27

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.

wadriller 23. Mär 2015 13:48

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.

himitsu 23. Mär 2015 14:03

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 07:15 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