Begriffserklärungen und Fragen


  • Mod

    ameise123 schrieb:

    den brauch ich doch sonst auch nicht?!?! für puts reicht doch einbinden der entsprechenden bibliothek!

    Witzbold!
    Und was glaubst Du was für eine Funktion puts verwendet?
    Was glaubst Du wohin puts letzten Endes ausgibt?
    Jaaaaa genau, die Antwort lautet: Auf das STD_OUTPUT_HANDLE!
    Und was hast Du gemacht?
    Genau: Du hast es geschlossen?
    Letzte finale Frage: Wie soll nun puts etwas ausgeben?



  • ja die c library greift auf die win32api zu und dort müsste sie doch dann einen neuen handle anlegen, sobald ich puts aufrufe?!?!
    ich schließe doch nur den einen handle, den hout, aber ich könnte doch jederzeit einen neuen erstellen?!?



  • "A process can be associated with only one console." Und die hast du dicht gemacht. Was passiert, wenn du puts("Warum wird dieser Text nicht ausgegeben?"); vor CloseHandle(...) setzt?
    Mit der Bitte um Antwort.


  • Mod

    ameise123 schrieb:

    ja die c library greift auf die win32api zu und dort müsste sie doch dann einen neuen handle anlegen, sobald ich puts aufrufe?!?!
    ich schließe doch nur den einen handle, den hout, aber ich könnte doch jederzeit einen neuen erstellen?!?

    Ahhh. Du erwartest also, dass die CRT Deine Fehler ausbügelt. 🤡

    Nun denn: Woher soll denn in den tiefsten tiefen der CRT aufeinmal wieder gewusst werden welches Ausgabehandle der Console (evtl. wurde es ja umgelenkt) zu nutzen ist. Machen wir also einfach "irgendein" neues auf?

    Es ist so wie chezzmatazz schreibt. Du bekommst EIN Handle für die Ausgabe in Deinem Prozess. Dieses benutzt die CRT auch. Du hast es geschlossen. Damit ist die Verbindung weg.
    Man hätte ja auch kein deterministisches Verhalten mehr, wenn die CRT mal so intern noch ein paar Kopien auf die Handles vorhalten würde.

    Grundsätzliche Frage: Warum mischt Du CRT und Konsolenfunktionen? IMHO unnötig. Entweder nimmt man das eine, oder das andere.



  • ja is klar das ich nur das eine oder das andere nehme, aber man muss halt auch mal verstehen wie beides zusammen harmoniert oder eben nicht. Also reines interesse an der art und weise wie das ganze funktioniert!


  • Mod

    Es harmoniert prima, solange Du das Handle nicht schließt!
    Dann lass das CloseHandle weg und alles ist prima.



  • also kann ich nach dem schließen des handles auf diese konsole weder eingaben noch ausgaben machen und auch kein neues handle erstellen das diese konsole nutzt?
    also puts vor closehandle setzen und dann gibt er was aus?


  • Mod

    ameise123 schrieb:

    also kann ich nach dem schließen des handles auf diese konsole weder eingaben noch ausgaben machen und auch kein neues handle erstellen das diese konsole nutzt?
    also puts vor closehandle setzen und dann gibt er was aus?

    Die Fragen wurden bereits beantwortet!



  • Du musst der CRT noch sagen auf *welcher* Console es was ausgeben muss:

    hCrt = _open_osfhandle(
                 (long) GetStdHandle(STD_OUTPUT_HANDLE),
                 _O_TEXT
              );
       hf = _fdopen( hCrt, "w" );
       *stdout = *hf;
       i = setvbuf( stdout, NULL, _IONBF, 0 );
    

    Siehe: http://support.microsoft.com/kb/105305/en-us



  • Das Handle ist hier nicht unbedingt erforderlich! Aber die Konsole sollte vorhanden sein. Das Freigeben der Konsole (FreeConsole) vor der Ausgabe ist in diesem Fall tödlich!!


Anmelden zum Antworten