in LOG schreiben bevor konsolen programm durch benutzer geschlossen wird....



  • #include <windows.h>
    #include <tchar.h>
    #include <iostream>
    #include <signal.h>
    
    BOOL WINAPI ConsoleHandler(
        DWORD dwCtrlType   //  control signal type
    );
    
    int main(int argc, char *argv[])
    {
        if (SetConsoleCtrlHandler( (PHANDLER_ROUTINE)ConsoleHandler,TRUE)==FALSE)
        {
            // unable to install handler... 
            // display message to the user
            printf("Unable to install handler!\n");
            return -1;
        }
    
        while(true)
        {
    
        }
    }
    
    BOOL WINAPI ConsoleHandler(DWORD CEvent)
    {
        char mesg[128];
    
        switch(CEvent)
        {
        case CTRL_C_EVENT:
            MessageBox(NULL,
                _T("CTRL+C received!"),_T("CEvent"),MB_OK);
            break;
        case CTRL_BREAK_EVENT:
            MessageBox(NULL,
                _T("CTRL+BREAK received!"),_T("CEvent"),MB_OK);
            break;
        case CTRL_CLOSE_EVENT:
            MessageBox(NULL,
                _T("Program being closed!"),_T("CEvent"),MB_OK);
            break;
        case CTRL_LOGOFF_EVENT:
            MessageBox(NULL,
                _T("User is logging off!"),_T("CEvent"),MB_OK);
            break;
        case CTRL_SHUTDOWN_EVENT:
            MessageBox(NULL,
                _T("User is logging off!"),_T("CEvent"),MB_OK);
            break;
    
        }
        return TRUE;
    }
    


  • gibts da ne doku zu? finde in google nichts was mir weiterhilft...

    was ist z.b.

    BOOL WINAPI ConsoleHandler(DWORD CEvent)
    {
        char mesg[128];
    
        switch(CEvent).......
    

    eine funktion? ich muss ja nämlich dann noch was in die textdatei schreiben... ofstream müsste ich ja mit in die main "funktion" packen, irgendwo am ende...

    oder wie kann ich denn in die textdatei schreiben? einfach mit in die switch case anweisung?



  • Du könntest auch einfach anders herum denken. Mach ein Log, wenn das Programm ordnungsgemäß beendet wurde. Beim nächsten Start kannst du prüfen, ob der Log vorhanden ist. Wenn nicht, dann weist du, dass das Programm beim letztem mal nicht ordnungsgemäß beendet wurde.



  • oder wie kann ich denn in die textdatei schreiben? einfach mit in die switch case anweisung?

    äh.
    ja? jain (siehe unten).

    du kannst auch eine unterfunktion machen die das logfile aufmacht und was reinschreibt.
    die unterfunktion rufst du dann "im switch case" einfach auf.

    der "ConsoleHandler" ist ne ganz normale funktion, nur dass sie asynchron (soweit ich mich erinnere in einem eigenen thread) aufgerufen wird wenn der user ctrl+C drückt bzw das fenster über das "X" zumachen will.
    d.h. du musst sicherstellen dass sich der haupt-thread und der thread in dem der "ConsoleHandler" ausgeführt wird nicht in die quere kommen.

    p.S.: ja, stimmt:
    http://msdn.microsoft.com/en-us/library/ms683242(v=VS.85).aspx

    An application-defined function used with the SetConsoleCtrlHandler function. A console process uses this function to handle control signals received by the process. When the signal is received, the system creates a new thread in the process to execute the function.


  • Mod

    Man sollte übrigens noch erwähnen, dass man damit nicht alle Möglichkeiten abfangen kann, ein Programm zu beenden. Windows XP kennt auch Methoden um einen Prozess ohne vorherige Ankündigung direkt zu beenden und einen Stromausfall kann man so natürlich auch nicht abfangen[*].

    [*]: Außer im Falle einer Notstromversorgung 🙂 .



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

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

    Dieses Posting wurde automatisch erzeugt.



  • d.h. du musst sicherstellen dass sich der haupt-thread und der thread in dem der "ConsoleHandler" ausgeführt wird nicht in die quere kommen.

    meine kenntnisse übersteigt das "wie ich sicherstelle.." 🙂

    Windows XP kennt auch Methoden um einen Prozess ohne vorherige Ankündigung direkt zu beende

    damit wäre der taskmanager und "prozess beenden" gemeint ?
    ne notstromversorgung habe wir glaub ich..

    wahrscheinlich bleibe ich aber schlicht dabei das ich einfach nur in die log schreibe wenn das programm gestartet wird. wenns zweimal hintereinander gestartet wird ist ja sowieso klar das es vorher beendet wurde...

    es sei denn ich bekomme raus wie ich sicherstelle das hauptthread und consolehandler sich nicht in die quere kommen... was würde denn passieren wenn sie es täten?



  • #include <cstdlib>
    
    void AusUndVorbei()
    {
        printf("Bye Bye !");
    }
    
    int main()
    {
        atexit(AusUndVorbei);
    }
    


  • wieso nicht gleich so einfach? oder gibts nen haken dabei??

    blöd ist nur ich darf der funktion keinen wert übergeben...
    und das doppelte ofstream sieht auch blöd aus lässt sich aber wohl nicht vermeiden...

    ich könnte ja auch ein "atexit(logfile.put("blabla"))" setzten.. aber das lässt er auch nicht zu

    void bla() {
    
            std::ofstream logfile("LOG.txt", std::ios_base::app);
            logfile << time_now() << " " << "Statwriter stopped." << std::endl;
        }
    
    int main() {
    
    char version[25] = "StatWriter v1.5";
    
    SetConsoleTitleA(version);
    
    std::ofstream logfile("LOG.txt", std::ios_base::app);
    
    logfile << "\n" << time_now() << " " << version << " started." << std::endl;
    
    atexit(bla);
    


  • #include <cstdlib>
    
    static char* version = "StatWriter v1.5";
    
    void AusUndVorbei()
    {
        printf("%s" version);
    }
    
    int main()
    {
        atexit(AusUndVorbei);
    }
    

    Und so? 😉



  • hab mein beitrag editiert...

    reicht wenn da steht statwriter.. die version ist da egal 😉

    so passt das... danke euch allen 😉
    ich frag mich aber trotzdem .. was der unterschied zu atexit und dem bsp von ..... ist 😉



  • Mit einem Konsolenprogramm geht das nicht in jedem Fall oder nur bedingt. Bei einer Windows-Anwendung machst du unter WM_DESTROY noch eine LOG-Eintragung 'Programm verabschiedet sich!'



  • wie nicht in jedem fall oder nur bedingt?

    also so funktioniert das recht gut.. bisher hatte ich da auch keine feherlemdlungen o.ä. ...

    natürlich schreibt er nicht in die log wenn ich den prozess kille... aber das kommt, sollte ja eh nicht vorkommen



  • Die Funktion aus signal.h müsste diesen Job doch auch erfüllen.


Anmelden zum Antworten