AGB  ·  Datenschutz  ·  Impressum  







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

Seltsame Exception

Ein Thema von Mystic · begonnen am 1. Nov 2005 · letzter Beitrag vom 1. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#1

Seltsame Exception

  Alt 1. Nov 2005, 20:42
Ich habe eine Klasse TProfileWriter zum Massenschreiben von Registryeinträgen.

Delphi-Quellcode:
TProfileWriter = class
    private
      Reg: TRegistry;
      Keys: TStringList;
      procedure FindKeys;
    public
      constructor Create;
      destructor Destroy; override;
      procedure WriteBinaryValue(const Name: string; var Value: array of byte);
      procedure WriteProfile(const Profile: TProfile);
  end;
Delphi-Quellcode:
procedure TProfileWriter.WriteBinaryValue(const Name: string; var Value: array of byte);
var
  i: cardinal;
begin
  if (Keys.Count > 0) and (Length(Value) > 0) then
    for i := 0 to Keys.Count - 1 do begin
      Reg.OpenKey(Keys.Strings[i], false);
      Reg.WriteBinaryData(Name,Value[0],Length(Value));
      Reg.CloseKey;
    end;
end;

procedure TProfileWriter.WriteProfile(const Profile: TProfile);
var
  pc: PAnsiChar;
  a: array of byte;
  i: cardinal;
begin
  SetLength(a, 4);
  GetMem(pc, 5);
  try
    FillChar(pc,5,0);
    with Profile.Settings do
    begin
      if Count > 0 then for i := 0 to Count - 1 do
      begin
        pc := PChar(LowerCase(ValueFromIndex[i]));
        HexToBin(pc,pc,4);
        CopyMemory(@a[0],pc,4);
        WriteBinaryValue(Names[i],a);
      end;
    end;
  finally
    FreeMem(pc);
  end;
end;
Wenn ich jetzt in einem ActionExecute-Event des Hauptforumulars WriteProfile mit einem Profil (ebenfalls eine Klasse mit einer Stringlist "Settings") aufrufe, kommt es in folgender Zeile zu einer Exception:

if (Keys.Count > 0) and (Length(Value) > 0) then
Zitat:
Im Projekt DNAProfChanger.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 0047122B in Modul 'DNAProfChanger.exe'. Lesen von Adresse 00000000' aufgetreten.
gefolgt von einer "Ungültigen Zeigeroperation".

Wenn ich WriteBinaryValue im OnCreate des Hauptformulars zum Test so aufrufe, tritt die Exception nicht auf und die Registryeinträge werden korrekt geschrieben.

Anscheinend ist Keys = nil beim Aufruf aus WriteProfile, aber das dürfte doch gar nicht sein!?
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Seltsame Exception

  Alt 1. Nov 2005, 20:46
Erzeugst du auch eine Instanz der Klasse?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Seltsame Exception

  Alt 1. Nov 2005, 20:51
Ja.

Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
var
  F: TSearchRec;
  i: integer;
  item: TListItem;
begin
  ProfileWriter := TProfileWriter.Create;
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Seltsame Exception

  Alt 1. Nov 2005, 20:53
Und wo wird die private variable Keys gefüllt?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Seltsame Exception

  Alt 1. Nov 2005, 20:56
Keys wird im Konstruktor von TProfileWriter erstellt.

Delphi-Quellcode:
constructor TProfileWriter.Create;
begin
  inherited;
  Reg := TRegistry.Create;
  Keys := TStringList.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;

  FindKeys;
end;
FindKeys füllt die Stringliste Keys mit Einträgen.
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: Seltsame Exception

  Alt 1. Nov 2005, 21:22
Hm, ich geb dir mal recht, wenn du die Instanzen so erzeugst wie gepostet dürfte dass nicht sein. Dann solltest du gucken, ob a) das was scheint auch so ist, am besten ein
Delphi-Quellcode:
if not assigned(keys) then
  begin
    ShowMessage('NACHRICHT');
  end;
vor die Zeile mit dem Fehler (mag überflüssig erscheinen, aber so kann man halt leicht auf Nummer sicher gehen!), ok, Debugger und den Wert von Keys tuts natürlich auch. Und wenn der sicher nil / 0 ist, dann muss
a) die Zeile Keys = TStringList.Create nie aufgerufen werden oder
b) Keys irgendwo wieder freigegeben werden, bevor der Aufruf von WriteBinaryValue auftritt. Dann heißt's nach dieser Stelle suchen. Vielleicht ein versehentlich zu frühes Free oder ein setzen von Keys = nil oder oder so. F
c) fällt mir gerade ein, ActionExecute könnte vor dem OnCreate Ereignis aufgerufen werden. Dann solltest du vor dem Aufruf prüfen ob Keys schon angelegt wurde oder (wozu ich dir dann raten würde) die Ereignisbehandlungsroutine (also dass was zu OnActionExecute gehört) erst im OnCreate zuweisen (nicht im Objekt Inspektor).

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Seltsame Exception

  Alt 1. Nov 2005, 21:26
Zitat von Der_Unwissende:
Hm, ich geb dir mal recht, wenn du die Instanzen so erzeugst wie gepostet dürfte dass nicht sein. Dann solltest du gucken, ob a) das was scheint auch so ist, am besten ein
Delphi-Quellcode:
if not assigned(keys) then
  begin
    ShowMessage('NACHRICHT');
  end;
vor die Zeile mit dem Fehler (mag überflüssig erscheinen, aber so kann man halt leicht auf Nummer sicher gehen!),
Hab ich schon probiert. Keys = nil.

Zitat von Der_Unwissende:
ok, Debugger und den Wert von Keys tuts natürlich auch. Und wenn der sicher nil / 0 ist, dann muss
a) die Zeile Keys = TStringList.Create nie aufgerufen werden oder
Seltsamerweise klappt es ja, wenn ich WriteBinaryValue im OnCreate von MainForm (nach dem TProfileWriter.Create) aufrufe.

Zitat von Der_Unwissende:
b) Keys irgendwo wieder freigegeben werden, bevor der Aufruf von WriteBinaryValue auftritt. Dann heißt's nach dieser Stelle suchen. Vielleicht ein versehentlich zu frühes Free oder ein setzen von Keys = nil oder oder so. F
Keys wird nur im Destruktor von TProfileWriter freigegeben.

Zitat von Der_Unwissende:
c) fällt mir gerade ein, ActionExecute könnte vor dem OnCreate Ereignis aufgerufen werden. Dann solltest du vor dem Aufruf prüfen ob Keys schon angelegt wurde oder (wozu ich dir dann raten würde) die Ereignisbehandlungsroutine (also dass was zu OnActionExecute gehört) erst im OnCreate zuweisen (nicht im Objekt Inspektor).
Die Aktion wird durch einen Buttonklick von mir ausgelöst, daher dürfte das wegfallen.

----

Seltsam. Mache ich die Methoden virtuell, tritt der Fehler schon hier auf:

WriteBinaryValue(Names[i],a);
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: Seltsame Exception

  Alt 1. Nov 2005, 21:32
Etwas dumme Frage, aber rufst du es in einem OnClick Event des Buttons auf, oder im OnActionExecute des Hauptformulars? Wäre hier doch ein gewaltiger unterschied
Zitat:
Wenn ich jetzt in einem ActionExecute-Event des Hauptforumulars WriteProfile mit einem Profil (ebenfalls eine Klasse mit einer Stringlist "Settings") aufrufe, kommt es in folgender Zeile zu einer Exception:
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#9

Re: Seltsame Exception

  Alt 1. Nov 2005, 21:33
Solangsam deutet alles darauf hin, dass du doch nicht korrekt eine Instanz von TProfileWrite erzeugst.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Seltsame Exception

  Alt 1. Nov 2005, 21:38
Zitat von Der_Unwissende:
Etwas dumme Frage, aber rufst du es in einem OnClick Event des Buttons auf, oder im OnActionExecute des Hauptformulars? Wäre hier doch ein gewaltiger unterschied
Welches OnActionExecute-Event?

Ich rufe es im OnExecute der Aktion auf.

Zitat von jim_raynor:
Solangsam deutet alles darauf hin, dass du doch nicht korrekt eine Instanz von TProfileWrite erzeugst.
Wie gesagt, wenn ich WriteBinaryValue aus dem OnCreate des Hauptformulars aufrufe, funktioniert alles.

Wenn ich WriteProfile im OnCreate aufrufe, kommt wieder der gleiche Mist.

Ich denke der Fehler ist im WriteProfile.
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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