Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Runtimeerror 216 at 00404856 (https://www.delphipraxis.net/164231-runtimeerror-216-00404856-a.html)

roadrunner-S51 3. Nov 2011 13:57

Runtimeerror 216 at 00404856
 
Hallo an Alle!

Seit einer Änderung an einem Delphi-Programm (zur Laufzeit werden nun Daten aus einer Ini-Datei gelesen) erhalte ich nach dem Beenden des Programms immer die folgende Fehlermeldung:

"Runtimeerror 216 at 00404856"

Einen Trojaner, wie im Internet oft geschrieben wird, kann ich ausschließen. Die Threads im Forum zu diesem Thema habe ich auch bereits gelesen, leider haben sie mir nicht weitergeholfen.

Welche Ursachen könnten noch vorliegen? Wie kann ich sie finden?

Schonmal Danke für Eure Hilfe!

DeddyH 3. Nov 2011 14:05

AW: Runtimeerror 216 at 00404856
 
Mehr als diesen Thread habe ich leider nicht zu bieten.

himitsu 3. Nov 2011 14:07

AW: Runtimeerror 216 at 00404856
 
Die Unit SysUtils macht die EXE zwr etwas größer, aber in Bezug auf Fehlerbehandlung ist die schon ganz nützlich, daß sie derartige Fehlercodes in "schöne" Exceptions umwandelt, welche man ganz einfach auswerten kann.

roadrunner-S51 3. Nov 2011 14:11

AW: Runtimeerror 216 at 00404856
 
@DeddyH: Erstmal Danke für deine schnelle Antwort!
Im Gegensatz zum Problem im besagten Thread ist bei mir der RuntimeError immer reproduzierbar und tritt nur beim Beenden der Anwendung auf.

Ich vermute das es irgendwas mit der Prozedur TApplication.DoShowOwnedPops oder mit dem Object.Free zu tun hat. Leider war es mir aber bisher nicht möglich, den genauen Punkt im Code zu finden...

@himitsu: die Unit SysUtils ist bereits eingebunden. Ich vermute nur, ich nutze sie falsch...

himitsu 3. Nov 2011 14:14

AW: Runtimeerror 216 at 00404856
 
- in den Projektoptionen "mit Debug-DCUs kompilieren" aktivieren
- Haltepunkt auf das
Delphi-Quellcode:
end.
der DPR
- und dann mit F7/F8 weitermachen, sich zur Fehlerstelle vorarbeiten und wenn man diese hat, dann versuchen rauszufinden was da nicht stimmt und von wo dieses stammen könnte.

roadrunner-S51 3. Nov 2011 14:17

AW: Runtimeerror 216 at 00404856
 
Jepp, das ist der Ansatz den ich bisher auch schon verfolge. Leider komme ich aber nirgendwo an. Irgendwo on den bereits genannten Prozeduren klicke ich mich mit F7 und Co scheinbar endlos durch.

Bummi 3. Nov 2011 14:17

AW: Runtimeerror 216 at 00404856
 
Zitat:

zur Laufzeit werden nun Daten aus einer Ini-Datei gelesen
wenn es nicht geheim ist kannst Du gegf. zeigen was Du wie machst, wenn Du liest wirst Du gegf. auch schreiben(zu einem ungünstigen Zeitpunkt?)

roadrunner-S51 3. Nov 2011 14:20

AW: Runtimeerror 216 at 00404856
 
Das interesaante dabei ist, dass die Stelle mit dem Lesen nur unter bestimmten bedingungen aufgerufen wird. Den Error bekomm ich aber schon, wenn diese bedingungen nicht erfüllt sind...

Hier trotzdem der Code zum Lesen der Ini-Datei
Delphi-Quellcode:
function Qx_Check (MaterialNr : Integer) : Integer;
var
  Ini : TIniFile;
  Zahl : Integer;
begin
  Ini := TIniFile.Create(DATAPATH+'SPE4000.ini');
  try
    if ini.ValueExists('Qx_Check', IntToStr(MaterialNr)) then
    begin
      Zahl := ini.ReadInteger('Qx_Check', IntToStr(MaterialNr), 0);
    end;
  finally
    Ini.Free;
  end;
  Result := Zahl;
end;
Mit Datapath ist das aktuelle Arbeitsverzeichnis gemeint. Dies ist korrekt und auch die ini-Datei ist darin vorhanden.

Bummi 3. Nov 2011 14:24

AW: Runtimeerror 216 at 00404856
 
Der Result ist zwar gegf. ein zufälliger Stackwert, ansonsten sieht das nicht böse aus....

Luckie 3. Nov 2011 15:01

AW: Runtimeerror 216 at 00404856
 
RunTime Error 216 ist eine Access Violation, wenn ich mich nicht täusche.

p80286 3. Nov 2011 15:15

AW: Runtimeerror 216 at 00404856
 
Zitat:

Zitat von Bummi (Beitrag 1134319)
Der Result ist zwar gegf. ein zufälliger Stackwert, ansonsten sieht das nicht böse aus....

Hier hat's bei mir geklingelt. Könnte es sein, daß du irgendwo über Array-Grenzen schreibst? Oder sonst irgendwelche Dyn. Strukturen zerschossen werden?
Jedesmal wenn beim Programmende ein Fehler aufgetaucht ist, dann war es meist soetwas.

(was sagen Beireichsprüfung und Co ?)

Gruß
K-H

Uwe Raabe 3. Nov 2011 15:26

AW: Runtimeerror 216 at 00404856
 
Ich würde hier zunächst erstmal madExcept einsetzen, um den Aufrufstack zur Laufzeit zu bekommen.

CCRDude 3. Nov 2011 16:26

AW: Runtimeerror 216 at 00404856
 
madExcept fängt aber nur, wie der Name schon sagt, Exceptions ab - keine Runtime Errors, zu deren Zeitpunkt das Exception Handling noch gar nicht bzw. schon nicht mehr geladen ist, oder?

Uwe Raabe 3. Nov 2011 17:16

AW: Runtimeerror 216 at 00404856
 
Zitat:

Zitat von CCRDude (Beitrag 1134340)
madExcept fängt aber nur, wie der Name schon sagt, Exceptions ab - keine Runtime Errors, zu deren Zeitpunkt das Exception Handling noch gar nicht bzw. schon nicht mehr geladen ist, oder?

Möglich - da ich madExcept aber immer in meinen Programmen drin habe, wäre es kein Mehraufwand. Einen Versuch ist es allemal wert.

sh17 3. Nov 2011 19:41

AW: Runtimeerror 216 at 00404856
 
Runtimeerror 216 ist meist der Hinweis darauf, das etwas freigegeben wird, was schon nicht mehr existiert.

roadrunner-S51 4. Nov 2011 06:51

AW: Runtimeerror 216 at 00404856
 
Guten Morgen!
Erstmal danke für die Antworten und Anregungen.

Weitere Recherchen haben ergeben, dass es sich um ein Problem mit einem Thread handelt. Wenn ich das Programm beende, ohne den Thread gestartet zu haben, habe ich keinen RuntimeError.
Wie kann ich prüfen, ob der Thread korrekt beendet wurde?

Luckie 4. Nov 2011 07:38

AW: Runtimeerror 216 at 00404856
 
Wie startest du denn den Thread? Benutzt du die API Funktionen oder deren Kapselung in der Delphi Thread-Klasse?

roadrunner-S51 4. Nov 2011 07:50

AW: Runtimeerror 216 at 00404856
 
Also den Thread rufe ich so auf:


Delphi-Quellcode:
    Workthread := tmeinthread.create(true);   // Thread erzeugen
    Workthread.OnTerminate := EndeMesslauf;   // bei Ende diese Funktion aufrufen
    Workthread.FreeOnTerminate := true;      
    Workthread.Resume;

Bummi 4. Nov 2011 07:55

AW: Runtimeerror 216 at 00404856
 
Delphi-Quellcode:
 Workthread.OnTerminate := EndeMesslauf;
wenn der Thread hier reinläuft und auf etwas zugegriffen wird was bereits freigegeben wurde hättest Du Deinen Fehler....

Bernhard Geyer 4. Nov 2011 07:56

AW: Runtimeerror 216 at 00404856
 
Könnte es sein das die Methode EndeMesslauf in einer Klasse liegt die schon abgeräumt ist?

roadrunner-S51 4. Nov 2011 08:02

AW: Runtimeerror 216 at 00404856
 
Also in der Funktion wird auf ein paar Buttons, sowie Labels auf dem MainFormular zugegriffen. Der Thread wird ja eigentlich nach Ende des Messvorgangs beendet und in der besagten Funktion die Buttons und Labels angepasst, um den Nutzer über das Ende des Messlaufs zu informieren. Daher war ich davon ausgegangen, dass der Thread zu dem Zeitpunkt, an dem ich das Programm beende, definitiv schon terminiert ist.

Das eigenartige dabei ist, das die Software so an sich bereits seit einiger Zeit feherlfrei läuft. Erst als ich neulich das mit den Ini-Dateien und die Ansteuerung eines dritten Com-Ports eingebaut habe, begann die Sache mit dem Error...

So, habe das Starten und Beenden der Threads nochmal debuggt. Der Thread verhält sich wirklich wie erwartet.

roadrunner-S51 7. Nov 2011 09:48

AW: Runtimeerror 216 at 00404856
 
Das Problem hat sich gelöst. Irgendwo im Code wurde rudimentär versucht, Werte in eine Datei zu schreiben. Diese Datei wurde beim Beenden des Programms nicht richtig geschlossen.


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