Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EReadError nur auf einem Rechner (https://www.delphipraxis.net/127857-ereaderror-nur-auf-einem-rechner.html)

Gruber_Hans_12345 20. Jan 2009 08:23


EReadError nur auf einem Rechner
 
Habe auf einem Kundenrechner ein Problem bekomme dort beim Starten einen EReadError mit

Fehler beim Lesen von TextLabel.Lines.Strings: Zugriffsverletzung bei Adresse 038D0000. Schreiben von Adresse 038D0000

das Problem ist, in der Unit, wo er einen Fehler bekommt (ist ein Splash screen) gibt es kein TextLabel.
Der Fehler kommt beim

Delphi-Quellcode:
constructor TfrSplash.Create(AOwner: TComponent; aIsTerminalServer : Boolean);
begin
    AddFullDebug('TfrSplash.Create.1');
    inherited Create(AOwner); << hier kommt der Fehler
    AddFullDebug('TfrSplash.Create.2');
end;
FormCreate wird nicht mehr aufgerufen
CreateParams wird noch richtig aufgerufen

Das ist der Stack zu dem Zeitpunkt ...
Code:
<Call="Forms.Forms.TApplication.HandleException" Offset="6" LineNumber="8256"/>
<Call="Controls.Controls.TWinControl.MainWndProc" Offset="9" LineNumber="7079"/>
<Call="Forms.Forms.TControlScrollBar.Update" Offset="20" LineNumber="2341"/>
<Call="Forms.Forms.TScrollingWinControl.UpdateScrollBars" Offset="16" LineNumber="2480"/>
<Call="Forms.Forms.TScrollingWinControl.WMSize" Offset="22" LineNumber="2598"/>
<Call="System.System.TObject.Dispatch"/>
<Call="Controls.Controls.TControl.WndProc" Offset="83" LineNumber="5146"/>
<Call="Controls.Controls.TWinControl.WndProc" Offset="111" LineNumber="7304"/>
<Call="Forms.Forms.TCustomForm.WndProc" Offset="136" LineNumber="3512"/>
<Call="Classes.Classes.TThreadList.UnlockList"/>
<Call="Graphics.Graphics.FreeMemoryContexts" Offset="12" LineNumber="5060"/>
<Call="Controls.Controls.TWinControl.MainWndProc" Offset="3" LineNumber="7073"/>
<Call="Classes.Classes.StdWndProc"/>
<Call="Controls.Controls.TWinControl.DefaultHandler" Offset="23" LineNumber="7334"/>
<Call="Forms.Forms.TCustomForm.DefaultHandler" Offset="7" LineNumber="4576"/>
<Call="Controls.Controls.TControl.WMWindowPosChanged" Offset="1" LineNumber="5409"/>
<Call="Controls.Controls.TWinControl.WMWindowPosChanged" Offset="11" LineNumber="7720"/>
<Call="Controls.Controls.TControl.WndProc" Offset="83" LineNumber="5146"/>
<Call="SysUtils.SysUtils.FormatBuf"/>
<Call="SysUtils.SysUtils.FormatBuf"/>
<Call="SysUtils.SysUtils.FormatBuf"/>
<Call="SysUtils.SysUtils.FormatBuf"/>
<Call="Controls.Controls.TWinControl.WndProc" Offset="111" LineNumber="7304"/>
<Call="System.System.@LStrFromPCharLen"/>
<Call="SysUtils.SysUtils.FmtStr"/>
<Call="Classes.Classes.TList.Delete"/>
<Call="Controls.Controls.TWinControl.WndProc" Offset="111" LineNumber="7304"/>
<Call="Forms.Forms.TCustomForm.WndProc" Offset="136" LineNumber="3512"/>
<Call="Classes.Classes.TThreadList.UnlockList"/>
<Call="Graphics.Graphics.FreeMemoryContexts" Offset="12" LineNumber="5060"/>
<Call="Forms.Forms.TCustomForm.WndProc" Offset="136" LineNumber="3512"/>
<Call="Controls.Controls.TWinControl.MainWndProc" Offset="3" LineNumber="7073"/>
<Call="Classes.Classes.StdWndProc"/>
<Call="Forms.Forms.TCustomForm.SetMenu" Offset="27" LineNumber="4032"/>
<Call="Forms.Forms.TCustomForm.DefaultHandler" Offset="7" LineNumber="4576"/>
<Call="Forms.Forms.TCustomForm.WMNCCreate" Offset="2" LineNumber="4941"/>
<Call="Controls.Controls.TControl.WndProc" Offset="83" LineNumber="5146"/>
<Call="Controls.Controls.TWinControl.WndProc" Offset="111" LineNumber="7304"/>
<Call="Forms.Forms.TCustomForm.WndProc" Offset="136" LineNumber="3512"/>
<Call="Controls.Controls.TWinControl.MainWndProc" Offset="3" LineNumber="7073"/>
<Call="Classes.Classes.StdWndProc"/>
<Call="Controls.Controls.InitWndProc" Offset="30" LineNumber="2072"/>
<Call="Windows.Windows.CreateWindowEx"/>
<Call="Controls.Controls.TWinControl.CreateWindowHandle" Offset="1" LineNumber="6778"/>
<Call="Forms.Forms.TCustomForm.CreateWindowHandle" Offset="25" LineNumber="4507"/>
<Call="Controls.Controls.TWinControl.CreateWnd" Offset="21" LineNumber="6762"/>
<Call="Classes.Classes.TReader.ReadValue"/>
<Call="Classes.Classes.TReader.CheckValue"/>
<Call="Classes.Classes.TReader.ReadListEnd"/>
<Call="Classes.Classes.TReader.ReadDataInner"/>
<Call="System.System.SysReallocMem"/>
<Call="Forms.Forms.TScrollingWinControl.CreateWnd" Offset="1" LineNumber="2374"/>
<Call="Forms.Forms.TCustomForm.CreateWnd" Offset="1" LineNumber="4432"/>
<Call="Controls.Controls.TWinControl.CreateHandle" Offset="3" LineNumber="6883"/>
<Call="Controls.Controls.TWinControl.HandleNeeded" Offset="4" LineNumber="8894"/>
<Call="Controls.Controls.TWinControl.GetHandle" Offset="1" LineNumber="8900"/>
<Call="Forms.Forms.TCustomForm.GetClientRect" Offset="1" LineNumber="3216"/>
<Call="Controls.Controls.TControl.GetClientHeight" Offset="1" LineNumber="3994"/>
<Call="Controls.Controls.TWinControl.ReadState" Offset="3" LineNumber="6096"/>
<Call="Controls.Controls.TControl.SetClientWidth" Offset="1" LineNumber="3989"/>
<Call="Controls.Controls.TWinControl.ReadState" Offset="9" LineNumber="6102"/>
<Call="Forms.Forms.TCustomForm.ReadState" Offset="33" LineNumber="3062"/>
<Call="Classes.Classes.TReader.ReadRootComponent"/>
<Call="Classes.Classes.TReader.ReadRootComponent"/>
<Call="Classes.Classes.TStream.ReadComponent"/>
<Call="Classes.Classes.InternalReadComponentRes"/>
<Call="Classes.Classes.InitComponent"/>
<Call="Controls.Controls.TWinControl.WndProc" Offset="111" LineNumber="7304"/>
<Call="System.System.@AfterConstruction"/>
<Call="System.System.TObject.Create"/>
<Call="Classes.Classes.InitInheritedComponent"/>
<Call="Classes.Classes.InitInheritedComponent"/>
<Call="Forms.Forms.TCustomForm.Create" Offset="8" LineNumber="2851"/>
<Call="Forms.Forms.TCustomForm.Create" Offset="16" LineNumber="2859"/>
<Call="System.System.@WStrClr"/>
<Call="System.System.UTF8Decode"/>
<Call="System.System.SysReallocMem"/>
<Call="System.System.TObject.NewInstance"/>
<Call="System.System.@ClassCreate"/>
<Call="frSplash.frSplash.TfrSplash.Create" Offset="1" LineNumber="246"/>
hat jemand einen hinweis zu dem problem?

das progamm läuft auf über 100 rechner ohne probleme, und es ist auch nichts auffälliges sonst zu sehen auf dem rechner (XP SP3 alles Standard)

nahpets 20. Jan 2009 08:47

Re: EReadError nur auf einem Rechner
 
Hallo,

habt Ihr die Exe auf dem Kundenrechner schonmal ausgetauscht, eventuell ist diese beschädigt.

Gruber_Hans_12345 20. Jan 2009 08:53

Re: EReadError nur auf einem Rechner
 
Zitat:

Zitat von nahpets
Hallo,

habt Ihr die Exe auf dem Kundenrechner schonmal ausgetauscht, eventuell ist diese beschädigt.

ja, schon öfters, habe ja schon einige debug meldungen eingebaut um zu sehen, woran es genau liegt ...

nahpets 20. Jan 2009 09:22

Re: EReadError nur auf einem Rechner
 
Hallo,

hast Du mal ein Programm geschrieben, dass nur so ein TextLabel enthält und geschaut, ob das Programm funktioniert?
Von welchem Typ ist TextLabel? Ist das irgendeine Windowskomponente..., die in Delphi gekapselt ist und (dummerweise) auf diesem einen Rechner fehlt oder in einer anderen Version vorliegt?

Will sagen, das muss nicht zwingend ein Fehler in Deinem Programm sein, es kann auch sein, dass das System auf dem Problemrechner irgendwie ein bisserl anders ist, als alle anderen.

Der Fehler läßt vermuten, dass das Programm etwas anderes aus dem Stream lesen will, als dort drin ist.

Gruber_Hans_12345 20. Jan 2009 11:25

Re: EReadError nur auf einem Rechner
 
Das problem ist aber, das dieses Form, was er da lädt, gar kein TEXTLABEL besitzt.

Keine Ahnung warum er versucht da was zu laden, wo es nix gibt ...

nahpets 20. Jan 2009 11:45

Re: EReadError nur auf einem Rechner
 
Hallo,

das ist aber seeeeehr komisch.

Was steht den in AOwner drin, was ist das für eine Klasse?
Von was ist TfrSplash abgeleitet?
Hat garantiert kein Vorfahre von irgendwem ein TextLabel?

Kannst Du in das
Delphi-Quellcode:
inherited Create(AOwner);
hineindebuggen?
Durchsuche mal das gesamte Projekt, ob da irgendwo ein Textlabel vorkommt, das in der Vererbungshierarchie bei einem Vorfahren von TfrSplash angesiedelt ist.

Funktioniert ein
Delphi-Quellcode:
inherited Create(Nil);
(unabhängig von eventuell später auftretenden negativen Nebenwirkungen)?

Mir ist es mehrmals passiert, dass ich auf Zugriffsverletzungen gestoßen bin, wobei der Fehler nicht an der Stelle aufgetreten ist, die mir Debugger und Fehleradresse meldeten, sondern die Fehler waren "kurz" vorher.

Gruber_Hans_12345 20. Jan 2009 15:07

Re: EReadError nur auf einem Rechner
 
TfrSplash ist von TForm abgeleitet


Delphi-Quellcode:
  TfrSplash = class(TForm)
    trLogin: TTimer;
    pmServers: TTBXPopupMenu;
    trAutoLogin: TTimer;
    ilFlags: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure trLoginTimer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure pmServersPopup(Sender: TObject);
    procedure trAutoLoginTimer(Sender: TObject);
  private
also Owner habe ich einmal Application und einmal nil übergeben, beides macht den selben Fehler ...

Ich verstehe es auch nicht wirklich, habe zwar auch schon öfters komische sachen gesehen, die dann ganz anders waren als vorerst offensichtlich, aber das ist schon sehr sehr komisch ...

Problem ist, auf dem Kundenrechner kann ich nicht debugen, sonst wäre es wahrscheinlich ein kinderspiel ....

dachte schon es hat was mit der codierung zu tun (hat vorhin mal ein problem, das ein sourcecode nicht ansi codiert war, und deshalb der Commandline compiler abgebrochen hat)

aber hier?!?!?!?

nahpets 20. Jan 2009 15:34

Re: EReadError nur auf einem Rechner
 
Hallo,

befürchte, Du mußt hier mal auf Deinem Rechner mit dem Debugger da durch und einfach die einzelnen Zeilen beobachten, ob Du da irgendwo an 'nem TextLabel vorbei kommst.

Ansonsten: Kannst Du
Delphi-Quellcode:
pmServers: TTBXPopupMenu;
mal durch
Delphi-Quellcode:
pmServers: TPopupMenu;
ersetzen oder das Menü auch mal ganz rausnehmen? Oder kannst Du feststellen, ob da eventuell intern irgendwo ein TextLabel genutzt wird.

Oder kannst Du ein anderes Formular anstelle des Splashformulars einbinden, dass ansonsten die gleiche Funktionalität hat oder zumindest soweit funktioniert, dass Du beim Programmstart über die "fehlerhafte" Stelle hinwegkommst?

'ne Idee zum systematischen Suchen hab' ich momentan zugegebenermaßen nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 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