Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unerklärliche Autoterminierung (https://www.delphipraxis.net/90448-unerklaerliche-autoterminierung.html)

Nils_13 17. Apr 2007 17:14


Unerklärliche Autoterminierung
 
Hi,

dieser Thread ist sozusagen der Nachfolger von diesem, da der andere schon zu sehr in mein aktuelles Problem mit hineingeht und es sonst zu unübersichtlich bei der Forensuche wird. Es liegt mit Sicherheit nicht an meinem Code zum Laden der Dateien beim Programmstart, deshalb habe ich diesen Thread aufgemacht, da es ein komplett anderes Problem ist.

Ich habe als Startparameter in der IDE einen vollkommen korrekten Pfad zu einem Lied genommen und gestartet. Es hat funktioniert.
Wenn ich allerdings mit "Öffnen mit..." oder Doppelklick im Explorer exakt diese Datei öffne, dann lädt mein Programm alles und beendet sich sofort. Ich habe extra in OnDestroy und an vielen anderen Stellen eine ShowMessage eingebaut, welche allerdings sofort weg war (regelrecht automatisch weggeklickt). Als Beweis habe ich mir einfach eine Datei an den entsprechenden Stellen erstellt. Sie wurde sogar in OnDestroy erstellt, allerdings gibt es von meinem Code her weder einen Grund zum automatischen Schließen der Nachrichten (nur bei meinem Programm werden Nachrichten geschlossen) noch einen Grund für die Autoterminierung.

Irgendeine Ideen bzw. hatte jemand schonmal ähnliche Phenomene ?

Jelly 17. Apr 2007 18:19

Re: Unerklärliche Autoterminierung
 
Dann hol ich mal meine Glaskugel raus :angel:

Sorry, zu verstaubt. Ich seh nix. :pale:

mkinzler 17. Apr 2007 18:23

Re: Unerklärliche Autoterminierung
 
Wie sieht den deine Dateiregistrierung aus?

Nils_13 17. Apr 2007 18:28

Re: Unerklärliche Autoterminierung
 
Das steht in dem Thread (siehe Link). Dort steht alles, aber ich bezweifle, dass das etwas damit zu tun hat.

Christian Seehase 17. Apr 2007 20:37

Re: Unerklärliche Autoterminierung
 
Moin Nils,

Du könntest auch mal an den für Dich interessanten Stellen im Programm Zwischenwerte per OutputDebugString wegschreiben.
Im OnDestroy funktioniert ein ShowMessage auch nicht mehr (MessageBox würde noch gehen).

Die per OutputDebugString geschriebenen Werte kannst Du dann im Event-Window nachsehen, vorausgesetzt, Du startest das Programm aus der IDE (View\Debug Windows\Event-Log)

hoika 17. Apr 2007 20:56

Re: Unerklärliche Autoterminierung
 
Hallo,

madexcept runterladen und damit testen.


Heiko

Nils_13 18. Apr 2007 14:39

Re: Unerklärliche Autoterminierung
 
Das ist ein Exeptionhandler, aber es treten keine Exeptions auf....

SirThornberry 18. Apr 2007 15:03

Re: Unerklärliche Autoterminierung
 
klingt für mich nach einem stackoverflow

Nils_13 18. Apr 2007 15:53

Re: Unerklärliche Autoterminierung
 
Und wieso passiert das nur, wenn ich die gleiche Datei, nur aus dem Explorer heraus, starte ?

himitsu 19. Apr 2007 14:33

Re: Unerklärliche Autoterminierung
 
Du könntest ja auch mal dein (Test)Programm anderen hier zur verfügung stellen, vielleicht finden die ja beim Debuggen den Fehler :stupid:

OldGrumpy 19. Apr 2007 15:06

Re: Unerklärliche Autoterminierung
 
Ich hab letztens mal was in der Richtung gehabt, bei der Analyse stellte sich dann heraus dass im *.dpr alles von Application.Initialize bis hinters Application.Run in einem globalen Try..Except-Block eingefasst war. Beim Starten des Programms fand die Application einen Registrywert nicht, lieferte den Fehler per Raise() nach oben durch und das Programm beendete sich noch in der TMainForm.OnFormCreate direkt wieder. Der Callstack sah sehr interessant aus :) Gefunden übrigens mit MadExcept - wunderbares Tool :)

Nils_13 19. Apr 2007 15:21

Re: Unerklärliche Autoterminierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hoffe es geht, denn ich bin mal wieder unter Linux und konnte es deshalb nicht testen:
1. Die angehängte Datei runterladen.
2. Ein neues Projekt erstellen.
3. Eine Listbox mit dem Namen lbList erstellen.
4. Den Code aus der uTest.pas einfach einbauen (selbsterklärend; ich habe LoadFiles eingesetzt, damit die Unterschiede zwischen dem Programm und dem Beispiel nicht zu groß werden).
5. Über "Öffnen mit" eine M3U öffnen.
Der Code vom richtigen Programm wäre zu groß gewesen, deshalb dieses kleine Beispiel.
Ich kann mommentan nicht zu Windows wechseln, ansonsten hätte ich kurz Windows gestartet und es dort schnell erstellt.

@OldGrumpy: Was heißt try..execpt ? (ich weiß was das ist, aber kann damit in Bezug auf das Problem nichts anfangen)

OldGrumpy 19. Apr 2007 18:50

Re: Unerklärliche Autoterminierung
 
Ganz einfach... die Exception die geworfen wurde weil das Programm dann versuchte, einen nicht existenten Registrykey zu lesen sorgte dafür dass das Programm direkt aus der TMainForm.CreateForm() in den Except-Block im *.dpr sprang. Der war leer und der Programmablauf danach zuende - Cleanup und tschüss.

Zur Verdeutlichung hier der entsprechende Schnipsel aus dem *.dpr:

[delphi]
begin
try
Application.Initialize;
Application.Title := 'MeinProgramm';
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TForm1, Form1);
[...]
Application.Run;
except
end;
end.

Im CreateForm trat nun eine Exception auf, die löste (auf Umwegen) den Handler oben aus und das Programm war zuende noch bevor es überhaupt richtig gestartet war.

Nils_13 19. Apr 2007 19:24

Re: Unerklärliche Autoterminierung
 
Also könnte der Fehler in der Registry liegen ?

OldGrumpy 19. Apr 2007 19:41

Re: Unerklärliche Autoterminierung
 
Ich glaub jetzt brauch ich nen Bier... :gruebel: :wall:

Nils_13 19. Apr 2007 20:39

Re: Unerklärliche Autoterminierung
 
Solche Posts helfen immer weiter ;) Du sagtest doch, dass so ein Absturz passieren kann, wenn der Registryeintrag nicht existiert. Falls es kein Except gibt, springt er gleich zu Destroy. Bloß habe ich keine Exception. Und zum xten für alle Mal: es passiert NUR AUS DEM EXPLORER RAUS UND NICHT AUS DER IDE!

OldGrumpy 19. Apr 2007 20:51

Re: Unerklärliche Autoterminierung
 
Ja also bitte, Du ziehst immer so unlogische Schlüsse. Ist ja wohl klar, dass das eigentliche Problem der Try..Except-Block ist und nicht der Registryzugriff. Aber da Du kein wirkliches Interesse an der Problemlösung hast ("Ich habe KEINE EXCEPTIONS", "Programm zu gross" und ähnliches blabla), bitte, nicht mein Bier. Wenn Du es nicht hier anhängen willst, kann ich Dir gerne nen entsprechenden FTP-Account geben. Ich schaus mir gerne mal an, aber entweder lieferst Du dafür den kompletten Projektcode oder zumindest ne ausführbare Version. Um mir auch noch nen evtl. ähnlich funktionierendes Programm zu bauen, bei dem gar nicht sicher ist ob der Fehler überhaupt auftritt, ist mir meine Zeit echt zu schade. Sorry wenn das hart klingt, aber naja, ich investier hier meine knappe Freizeit (wie etliche andere auch) und da kann man ja wohl mal etwas Vorarbeit erwarten.
:duck:

Nils_13 30. Apr 2007 20:35

Re: Unerklärliche Autoterminierung
 
Hi,

nach langer Wartezeit, möchte ich zur meiner Lösung kommen (der Releasepunkt hat sich bereits um über 1,5 Jahre verschoben und verschiebt sich gerade schon wieder bei der letzten Sache). OldGrumpy ist zur Zeit verhindert und macht deshalb verständlicher Weise nichts. Ich habe für die Lösung zwei Sachen zu bieten:
1.:
OldGrumpy äußerte, dass es an dem Try..Except liegen müsste, deshalb hier der Code von dem "Try..Except":
Delphi-Quellcode:
var s : String;
begin
  Application.Initialize;
  Application.Title := 'Dark Player II';
  s := ExtractFilePath(Application.ExeName) + 'skins\';
  if DirectoryExists(s) then
  begin
    with TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'settings.ini') do
    begin
      if DirectoryExists(ExtractFilePath(Application.ExeName) + 'skins\') then
      begin
        s := s + ReadString('Settings', 'Skin', 'blue.dpsf');
      end;
      Free;
    end;
    if FileExists(s) then
    begin
      Application.CreateForm(TfrmMain, frmMain);
      Application.CreateForm(TfrmSkinSector, frmSkinSector);
      Application.CreateForm(TfrmMsgBox, frmMsgBox);
      Application.CreateForm(TfrmVideo, frmVideo);
      Application.CreateForm(TfrmODd, frmODd);
      Application.CreateForm(TfrmOp, frmOp);
      Application.CreateForm(TfrmFavs, frmFavs);
      Application.CreateForm(TfrmTags, frmTags);
      Application.CreateForm(TfrmSetting, frmSetting);
      Application.CreateForm(TfrmLicense, frmLicense);
    end else
    begin
      Application.CreateForm(TfrmMsgBox, frmMsgBox);
      MsgBox('Skinfile not found!');
    end;
  end else
  begin
    Application.CreateForm(TfrmMsgBox, frmMsgBox);
    MsgBox('Skindirectory not found!');
    Exit;
  end;
  Application.Run;
end.
2.:
Ich kann, falls dies nicht genügen sollte, einen Nachbau anfertigen, der eine - abgesehen von den Formen - gleiche Programmdatei (dpr) hat und auch im allgemeinen ein Nachbau ist, abgesehen davon, dass natürlich ein Großteil, aus folgenden Gründen, fehlen würde:
1. Ich habe sehr viel Zeit in dieses Projekt gesetzt und ich möchte es einfach nicht online stellen, da ich nicht will, dass jeder Zugriff auf meine Arbeit hat. Bei ein/zwei/drei Personen ist das ok, aber eine Community ist zu viel.
2. Es ist immer an die eingebundenen Komponenten zu denken. Es hält sich im Vergleich zur Projektgröße zwar relativ in Grenzen, allerdings habe ich teilweise kleine Modifizierungen eingebaut, damit es besser funktioniert. Dies führte übrigens schon bei einem anderen zu Problemen, als er die modifizierten Komponenten installieren wollte (lag scheinbar an den neuen Versionen, kA warum. Das ist auch nicht das Thema).

PS: Wenn jemand auf Anhieb weiß, dass ihm der Code oben nicht reicht, dann bitte sofort antworten und ich erstelle und stelle schnellstmöglichst die kleine Projektversion rein.


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