Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 14:16 Uhr.
Seite 2 von 2     12   

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