Öffnen per Doppelklick



  • Hallo zusammen!

    Wenn ich auf eine Datei meines Programmes doppelklicke, und somit das Programm startet und die Datei öffnet, stürzt mein Programm jedesmal ab. Öffne ich eine Datei, wenn das Programm schon läuft, gibts keine Probleme.

    Habe den Fehler auch schon gefunden, weiß aber nicht genau wie ich ihn am besten behebe: Das Problem besteht darin, dass ich in meiner Serialize-Funktion beim Laden z.B. eine Nachricht an das Hauptfenster schicke, ein Menü-Item aktiviere, usw...
    Genau an diesen stellen gibt es nun Abstürze, wenn ich per Doppelklick öffne, da dann die Serialize-Methode aufgerufen wird, bevor überhaupt das Hauptfenster der Anwendung angezeigt wird. Das Menü existiert zu diesem Zeitpunkt anscheinend auch noch nicht. Daher die Abstürze.

    Hat jemand ne Idee wie ich das am besten löse bzw. wie ich es schaffe, dass erst das Programm vollständig gestartet wird, und dann erst die Serialize-Methode aufgerufen wird?
    Und weiß jemand was da beim Öffnen durch doppelklick genau abläuft?

    Für mich ist es auch ein großes Problem bei der Sache, dass ich es nicht schaffe das ganze im Debug-Modus zu verfolgen. Denn wenn ich auf eine Datei doppelklicke, startet er einfach die exe des Programms, ohne dass ich irgendwo Debug-Ausgaben sehe... 😞 Hätte ich dieses Problem nicht, hätte ich vielleicht schon viel mehr durch das debuggen herausfinden können... Hat jemand dazu auch noch nen Tip?

    Danke schonmal!

    Gruß
    Brainiac



  • du hast sicher den Laden-Code direkt in der On...-Methode des Menus? Mach eine neue vom Menu unabhängige Methode zum Laden der Datei, evetl klappt das



  • Das Problem hatte ich auch schon mal. Allerdings habe ich nur ein paar CStrings und ein paar Doubles hin und her geschoben. Habs nicht hinbekommen und musste das anders implementieren. Meines Wissens läuft der Programmstart (ob nun mit oder ohne des Öffnens einer Datei) immer in der Reihenfolge:
    InitInstance()
    Konstruktor ApplicationDoc
    DeleteContents()
    OnNewDocument()
    DeleteContents()
    Serialize(load)
    ...
    ab. Die Menüleiste wird doch in der OnCreate() erstellt und die wird nach InitInstance() und somit also vor Serialize aufgerufen. Mach doch mal in alle Funktionen ein TRACE-Makro rein, dann kannst Du im Debugfenster die Aufrufreihenfolge verfolgen.



  • AndyDD schrieb:

    Mach doch mal in alle Funktionen ein TRACE-Makro rein, dann kannst Du im Debugfenster die Aufrufreihenfolge verfolgen.

    Genau das war auch mein erster Ansatz! (Die TRACEs hab ich schon drin) Doch dann hatte ich ja das Problem, dass ich ja kein Debugfenster habe, wenn sich das Programm "selbst" startet, wie das ja beim Doppelklick auf ein Dokument des Programms passiert. (Ich starte das Programm ja nicht über "Debug" im VC++ !!!) Oder stehe ich da auf dem Schlauch???

    Wenn ich wenigstens das Debug-Fenster hätte, wäre ich schon einen großen Schritt weiter!

    EDIT: Ich komme immer erst in den Debug-Modus, wenn der Crash passiert, dann kommt nämlich diese Meldung "Klicken sie auf Abbrechen um das Programm zu debuggen..." Dadurch habe ich wenigstens den Fehler entdeckt. Aber es muss doch eine Möglichkeit geben, dass sich das Programm von Anfang an im Debug-Modus startet?!?!?



  • Du hast natürlich Recht, wo war ich nur mit meinen Gedanken. Die Makros funktionieren ja nur in der IDE. Aber sie sind ein gutes Hilfsmittel um die Reihenfolge der Funktions- und Methodenaufrufe zu checken.
    Als nächstes wäre nur der Umweg über eine log-Datei anstatt des TRACE-Makros, in die Du aus jeder Methode heraus einen Eintrag hineinschreibst. Sowas "überlebt" die Laufzeit. Damit könnte man zumindest mal die Aufrufreihenfolge klären. Ich denke aber, dass diese sich nicht ändert. Was schickst Du denn an Dein Hauptfenster?



  • Brainiac schrieb:

    , ein Menü-Item aktiviere, usw...
    [...]
    Das Menü existiert zu diesem Zeitpunkt anscheinend auch noch nicht. Daher die Abstürze.

    So was macht man ja auch nicht. Zum Aktivieren und Deaktivieren von Menüeinträgen benutzt man die entsprechenden UpdateUI-Handler.



  • Hmm, da hast du natürlich recht. Leider hab ich noch mehrere Sachen in der Serialize, wo ich nicht weiß, wie ich die anders unterbringe. Die müssen nämlich auf jeden Fall genau VOR dem Laden der Datei gemacht werden (am besten wäre während des Ladens, deswegen hab ich sie ja dort hin geschrieben)

    Aber das mit der log-Datei is n sehr guter Tipp, das werd ich sofort ausprobieren! Gibts für solche logs zufällig auch ein MFC-Makro o.ä. oder muss ich das "ganz normal" über CStdioFile machen?

    Gruß Brainiac



  • Bevor du das Loggen anfängst - wie wäre es mit MessageBoxen statt TRACEs? 🙂
    Ist ja nicht für ewig und geht mit Suchen und Ersetzen relativ schnell. 😉


Anmelden zum Antworten