AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Debugger von Delphi XE x lügt

Ein Thema von wadriller · begonnen am 13. Mär 2015 · letzter Beitrag vom 23. Mär 2015
Antwort Antwort
wadriller

Registriert seit: 25. Feb 2009
43 Beiträge
 
Delphi XE2 Professional
 
#1

Debugger von Delphi XE x lügt

  Alt 13. Mär 2015, 15:10
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 ?
Gruß
Michael
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Debugger von Delphi XE x lügt

  Alt 13. Mär 2015, 16:14
Sicher dass du KeyExists nicht NACH dem OpenKey auswertest?
  Mit Zitat antworten Zitat
wadriller

Registriert seit: 25. Feb 2009
43 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Debugger von Delphi XE x lügt

  Alt 13. Mär 2015, 16:32
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

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.
Gruß
Michael
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Debugger von Delphi XE x lügt

  Alt 13. Mär 2015, 17:29
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.
Miniaturansicht angehängter Grafiken
registryaccess.png  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Debugger von Delphi XE x lügt

  Alt 13. Mär 2015, 19:20
Zitat:
const registryPath: String = 'Software\Günthersoft\meinProgramm';
const registryPath: String = '\Software\Günthersoft\meinProgramm';

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



Zitat:
Wer misst misst Mist.
$2B or not $2B
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Debugger von Delphi XE x lügt

  Alt 13. Mär 2015, 19:27
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Debugger von Delphi XE x lügt

  Alt 13. Mär 2015, 19:36
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;
$2B or not $2B
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#8

AW: Debugger von Delphi XE x lügt

  Alt 13. Mär 2015, 20:27
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.
  Mit Zitat antworten Zitat
wadriller

Registriert seit: 25. Feb 2009
43 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Debugger von Delphi XE x lügt

  Alt 23. Mär 2015, 14:48
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.
Gruß
Michael
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Debugger von Delphi XE x lügt

  Alt 23. Mär 2015, 15:03
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

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)
$2B or not $2B

Geändert von himitsu (23. Mär 2015 um 15:10 Uhr)
  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 01:52 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