atexit auch bei ExitProcess



  • Wenn ich mit

    ExitProcess(0);

    mein Programm beende wird

    atexit(blabla);

    nicht ausgeführt. Wie kann ich das umgehen?



  • ExitProcess nicht benutzen.



  • exit(0) benutzen.



  • Mit exit(0) gehts. Danke.



  • exit würde ich aber auch nicht aufrufen. lass das programm doch auslaufen oder benutzen PostQuitMessage bei einer anwendung mit message loop.



  • exit(0) schrieb:

    exit würde ich aber auch nicht aufrufen. lass das programm doch auslaufen oder benutzen PostQuitMessage bei einer anwendung mit message loop.

    Warum nicht?



  • weil dann der speicher nicht freigegeben wird. und zum beispiel in c++ keine destruktoren aufgerufen werden.



  • exit(0) schrieb:

    weil dann der speicher nicht freigegeben wird. und zum beispiel in c++ keine destruktoren aufgerufen werden.

    Und wie kann ich das umgehen, außer die Funktion wirklich zuende laufenlassen?

    Und wenns nicht geht: ist mir auch egal.



  • exit(0) schrieb:

    weil dann der speicher nicht freigegeben wird.

    nee, das stimmt nicht. war vielleicht mal bei windoofs 95,98 etc. ein problem, aber die heutigen betriebssysteme geben den speicher frei, wenn ein prozess nicht mehr existiert. egal wie er beendet wurde, ob durch exit() oder absturz.

    exit(0) schrieb:

    und zum beispiel in c++ keine destruktoren aufgerufen werden.

    das schon, aber das interessiert in vielen fällen nicht mehr.



  • Ich hab es jetzt nicht ausprobiert aber vielleicht kann man das mit einer Exception lösen. Wenn du kein Messageloop hast geht es sicher. Andernfals, musst du per PostQuitMessage aus dem Loop brechen. Das sollte so gehen (nicht getest!):

    exception*excep=0;
    int WinMain( /*...*/ ){
      MSG msg;
      try{
         //...
         while(GetMessage(&msg,0,0,0))
         {
             TranslateMessage(&msg);
             DispatchMessage(&msg);
         }
         if(excep)
           throw excep;
         //...
      }catch(exception*excep){
        MessageBox(0,excep.what().c_str(),"Error",16);
        delete excep;
      }
      return msg.wParam;
    }
    LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
    {
      try{
        switch(msg){
          //...
        }
      }catch(exception*e){
        excep=e;
        PostQuitMessage(0);
        return 0;
      }
      return DefWindowProc(hwnd,msg,wp,lp);
    }
    

    Ist zwar nicht ideal wegen des Pointers aber WinAPI ist halt nicht ideal.

    Könnte klappen...



  • lol. was tust du da? warum einen pointer catchen? das macht man immer per referenz. und delete auf ne exception? normalerweise legt man ne exception auf dem stack ab. 😉



  • catch schrieb:

    lol. was tust du da? warum einen pointer catchen? das macht man immer per referenz. und delete auf ne exception? normalerweise legt man ne exception auf dem stack ab. 😉

    Tja exception hat aber keine virtuelle clone Funktion und da man ja die Ausnahme irgendwo zwischen lagern muss bleibt nur einen Pointer und new zu nutzen und dann up zu casten.



  • Dieser Thread wurde von Moderator/in cd9000 aus dem Forum WinAPI in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply