AllocConsole() -> printf/cout



  • Moin,
    Ich möchte per Button-Klick die Systemuhrzeit ausgeben... wieso weshalb warum ist ja erstmal egal.. Auf jeden Fall funktioniert die Ausgabe über die AllocConsole nicht.
    Wird der Button gedrückt, wird eine Void-Funtion ausgeführt. In dieser binde ich die AllocConsole ein und möchte die Systemzeit ausgeben.
    Hier ein Teil des Codes:

    AllocConsole();
    time_t Zeitstempel;
    tm* nun;
    Zeitstempel = time(0);
    nun = localtime(&Zeitstempel);
    printf(" Test Ausgabe ");
    
    cout << nun->tm_mday << '.' << nun->tm_mon + 1 << '.'
    << nun->tm_year + 1900 << " - " << nun->tm_hour
    << ':' << nun->tm_min << endl;
    

    Hat Jemand eine Idee ?



  • Hast du mal den Rückgabewert von AllocConsole() ausgewertet?



  • if (!AllocConsole())
    	MessageBox(NULL, L"Fenster wurde nicht erstellt", NULL, MB_ICONEXCLAMATION);
    

    Hiermit habe ich es jetzt mal erzeugt -> Es wird die MSGBox ausgeführt. Hm.. aber wieso ?



  • GetLastError() aufrufen und Fehlercode angucken.



  • Wie kann ich mir den Fehler denn durch GetLastError() ausgeben bzw angucken ?

    EDIT: Ich habe den Rückgabewert (INT) aufgefangen und mit Hilfe einer MsgBox ausgegeben -> 0 ist der Rückgabewert



  • Ohne dir jetzt nahetreten zu wollen: Die MSDN bietet eine ausgezeichnete Hilfe zur WinAPI, in der es zu fast jeder Funktion Beispiele gibt. Und zu GetLastError() und FormatMessage() gibt es ganze tolle Beispiele. Da könnte man mal die Suchmaschine seiner Wahl benutzen.





  • @TKuehn
    Da ist doch alles drin, was du brauchst.



  • Ja, scheint aber veraltet zu sein. Der Code schmeißt einen Fehler:

    if (!GetProcessId(NULL))
    			ErrorExit(TEXT("GetProcessId"));
    

    const wchar_t* ist mit dem Parameter vom Typ LPTSTR inkompatibel.



  • OK, darum kümmern wir uns dann später.

    Probier´ mal die Konsolen-Streams neu zu öffnen:

    bool alloc_console()
    {
       if( AllocConsole() )
       {
          FILE* console_in= freopen( "conin$",  "r", stdin );
          FILE* console_out = freopen( "conout$", "w", stdout );
          FILE* console_err = freopen( "conout$", "w", stderr );  
          return console_in && console_out && console_err;
        }
        return false;
    }
    

    Edit: Variablennamen verschönert, bevor sich hier wieder jemand aufregt 😉



  • @DocShoe
    Nun funktioniert es. Danke dir !



  • @TKuehn sagte in AllocConsole() -> printf/cout:

    Hm.. aber wieso ?

    MSDN oder Microsoft Docs sagt:

    A process can be associated with only one console, so the AllocConsole function fails if the calling process already has a console. A process can use the FreeConsole function to detach itself from its current console, then it can call AllocConsole to create a new console or AttachConsole to attach to another console.


Log in to reply