Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programm startet nicht: "Invalid data" (https://www.delphipraxis.net/179805-programm-startet-nicht-invalid-data.html)

BlueStarHH 3. Apr 2014 08:26

Programm startet nicht: "Invalid data"
 
Ein Kunde hat ein Multibootsystem: Zwei mal Windows 8 x64 auf der selben SSD. Startet er die erste Windows-Installation, läuft mein Programm normal. Startet er hingegen die zweite Windows-Installation erscheint direkt beim Start meines Programms die Meldung "Invalid data." und danach "Zugriffsverletzung bei Adresse 006E5027 in Modul 'XYZ.exe'. Lesen von Adresse 00000000." Das Hauptfenster wird nicht sichtbar, aber der Programm verbleibt im Arbeitsspeicher. Zu sehen im Taskmanager in der Liste der Hintergrundprozesse.

Die zweite Windows-Installation ist Clone der ersten Installation der mit Acronis TrueImage erstellt wurde. Alle anderen Programme laufen ohne Probleme. Mein Programm braucht keine Installation oder bestimmte Dinge. Es ist eine ganz normale mit Delphi erstelle EXE mit einem Hauptfenster (kein "Hintergrundprozess").

Was kann das sein? Wer kann helfen? Danke!

sx2008 3. Apr 2014 08:46

AW: Programm startet nicht: "Invalid data"
 
Du bräuchtest einen Stacktrace damit du die Exception genau lokalisieren kannst.
Dazu kannst du z.B. MadExept oder die Jedi Code Library (open source) verwenden.
Im Unterverz. examples der JCL gibt es dazu ein Beispiel wie man den Stacktrace anzeigen kann.

Zunächst einmal würde ich die Projektdatei mit
Delphi-Quellcode:
ShowMessage()
oder
Delphi-Quellcode:
MessageBox()
Aufrufen präparieren.
Also zwischen jede Anweisung in der Projektdatei eine Meldung setzen damit du weisst wo du suchen musst.

Könnte auch sein, dass die Exception schon erzeugt wird, bevor die Anweisungen in der Projektdatei überhaupt abgearbeitet wurden.
Dann müsste man die Initialization-Abschnitte in allen Units insbesondere von nicht-Standard Komponenten anschauen.
Weitere Tipps findest du hier: http://www.delphipraxis.net/210739-post10.html

jaenicke 3. Apr 2014 08:47

AW: Programm startet nicht: "Invalid data"
 
Du solltest erst einmal prüfen, ob im Konstruktor des Formulars mehr ausgeführt wird als das reine Initialisieren von Variablen. Manchmal wird der Fehler gemacht dort z.B. schon Netzwerkverbindungen oder ähnliches zu öffnen.
In dem Fall sollte zumindest ein try..except mit einer Fehlerausgabe oder -behandlung drum sein.

Und dann gibt es noch Tools wie madexcept oder Eurekalog, die dir die Fehlerstelle liefern können.

himitsu 3. Apr 2014 09:07

AW: Programm startet nicht: "Invalid data"
 
Mann kann natürlich auch klein anfangen und mit ein paar Try-excepts seinen Startcode absichern, bzw. mit einer netten "Positionsangabe" die Exception-Message erweitern.

Entweder den Startcode ins OnCreate, wie es viele machen, aber wenn auf der Form schon Datenkomponenten sind, welche beim Start schon was machen, dann:

Delphi-Quellcode:
constructor Create(AOwner: TComponent); override;
Delphi-Quellcode:
constructor TForm1.Create(AOwner: TComponent);
begin
  try
    inherited;
  except
    if not HandleCreateException then
      raise;
  end;
end;
PS: Ungefähr so ist auch das OnCreate abgesichert (seit, ich weiß nicht wann), so daß selbst bei einer Exception im OnCreate die Form nicht komplett verreckt.

Wobei es hier dennoch nicht schlecht gewesen wäre, wenn man dem Handle Exception noch die adresse mitgegeben hätte.


Delphi-Quellcode:
constructor TForm1.Create(AOwner: TComponent);
begin
  try
    inherited;
  except
    on E: Exception do begin
      //E.Message := Self.SecureClassName + '(' + Self.SecureName + '): ' + E.Message; // ich hab mir via Class-Helper da bein paar geschützte Property geschaffen, da sie öfters verwendet werden, welche auch mit nil und ungültigen Zeigern zurechtkommen
      try
        E.Message := Self.ClassName + '(' + Self.Name + '): ' + E.Message;
      except
        E.Message := 'TForm.Create: ' + E.Message;
      end;
      if not HandleCreateException then
        raise;
    end;
  end;
end;


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