SplashScreen in SDI-Anwendung beenden



  • Hi,

    ich habe folgendes Problem zu dem ich irgendwie keine Lösung finde:

    Ich habe in meine SDI-Anwendung einen Splashscreen eingeblendet, das funzt auch wunderbar. Nun möchte ich aber in OnNewDocument (wenn es zum Beispiel zu Fehlern beim Erstellen/Laden kommt) eine MessageBox anzeigen. Jedoch bekomme ich eine unbehandelte Ausname (Access Violation) wenn ich die MessageBox anzeigen lassen möchte.
    Entferne ich das "CSplashWnd::ShowSplashScreen(this);" aus MainFrm.cpp wird funktioniert alles einwandfrei, ebenso wenn ich die MessageBox(en) weglasse. Ich brauch sie aber..

    Woran wird der SplashScreen beendet? und wir kann ich das in OnNewDocument von "hand" machen?

    mfg
    tobi



  • Hmm, also da scheinbar keinem was dazu einfällt, mal anders..

    Wieso bekomme ich ne Access Violation sobald ich einen Modalen Dialog öffnen möchte (eigener Dialog, MessageBox) wärend der SplashScreen offen ist.



  • was machst du noch auf OnNewDocument? Greifst du da vielleicht auf eine Datei zu, die schon verwendet wird?



  • Springt er bei der Access violation irgendwo in den Quellcode? Wohin? Kannst du da was erkennen? 🙂



  • Hi,

    jo also er springt in die "AFXWIN2.INL" an die Stelle:

    { ASSERT(::IsWindow(m_hWnd)); ::UpdateWindow(m_hWnd); }
    

    ich habe mal ein Demo-Projekt dafür erstellt, also ne ganz neue SDI-Anwendung mit SplashScreen und MsbBox im OnNewDocument..

    http://www.tow-b.de/cpp/splashtest.rar

    @Polofreak: Nein ich öffne keine Datei, ich öffne nur eine Verbindung zum COM-Port und greife auf die Registry auf jeden fall lesend (ab und zu auch schreibend) zu. Aber solange ich den SplashScreen nicht anzeige funktioniert es ja einwandfrei..



  • Tja, ich kann dir leider nur sagen, warum er abstürzt (IMHO) und nicht, wie du das behebst.

    Es knallt, weil die eigentliche Applikation noch kein Hauptfenster hat. Der greift ganz ohne Prüfung auf einen NULL-Zeiger zu:

    void CSplashWnd::HideSplashScreen()
    {
    	// Fenster entfernen und Hauptrahmen aktualisieren
    	DestroyWindow();
    	AfxGetMainWnd()->UpdateWindow();
    }
    

    AfxGetMainWnd() gibt NULL zurück.

    Ich vermute, dass da was zeitlich nicht zusammen passt.



  • Hmm ich habe das jetzt mal auf nem anderen PC getestet und da habe ich gesehen, das da ja noch die MsgBox angezeigt wird bevor er abschmiert.

    Und durch deinen Tipp denke ich mal das er wohl erkennt, dass er sich beenden soll, dabei aber auf das noch nicht exisierende Hauptfenster zugreift... hmm so ein Mist aber auch ;).

    naja zur Not muss ich mir selber sowas wie nen SplashScreen bauen den ich besser unter kontrolle habe.. könnte ich ja komplett in der OnNewDocument als nicht-modalen dialog machen..


Anmelden zum Antworten