Win Api, einfaches Script oder Logging window



  • Kenne mich mit der WinApi noch nicht so gut aus und wollte ein Script oder Logging Window erstellen, in welches ich einfach Text ausgeben kann ohne Koordinaten festzulegen (also mit automatischem Carriage Return und Linefeed). In den Tutorials habe ich bisher nichts darüber gefunden und bin mit eigenen Versuchen gescheitert. Allerdings kann ich mir nicht vorstellen, dass man sowas mit der WinApi nicht machen kann. Das Dos Terminal könnte man auch für die Ausgabe verwenden, wenn die Gnu Scientific Library nicht sämtliche couts bzw. printfs blockieren würde. Also wollte ich als Alternative eine mehr Windows angemessene Methode verwenden, den Text auszugeben.

    Vielen Dank für eure Hilfe!



  • eine einfaches Konsolenfenster für printf und cout öffnet man z.B. so:

    void InitConsole ()
      {
      int hCrt;
      FILE * hf;
      struct _COORD bufferSize = { 80, 1000 };
    
      AllocConsole ();
      SetConsoleScreenBufferSize (GetStdHandle (STD_OUTPUT_HANDLE), bufferSize);
      hCrt = _open_osfhandle ((intptr_t) GetStdHandle (STD_OUTPUT_HANDLE), _O_TEXT);
      hf = _fdopen (hCrt, "w");
      * stdout = * hf;
      hCrt = _open_osfhandle ((intptr_t) GetStdHandle (STD_ERROR_HANDLE), _O_TEXT);
      hf = _fdopen (hCrt, "w");
      * stderr = * hf;
      hCrt = _open_osfhandle ((intptr_t) GetStdHandle (STD_INPUT_HANDLE), _O_TEXT);
      hf = _fdopen (hCrt, "r");
      * stdin = * hf;
      }
    


  • MC schrieb:

    Das Dos Terminal könnte man auch für die Ausgabe verwenden, wenn die Gnu Scientific Library nicht sämtliche couts bzw. printfs blockieren würde.

    Ich hab' noch nie von einer normalen Library gehört, die printf() bzw. cout Ausgaben blockiert.
    Bist du sicher dass der Prozess überhaupt ein Konsolenfenster hat?

    @dd++
    *stdout etc. überschreiben ist gar keine gute Idee.
    freopen("CON", "w", stdout); wäre glaube ich die bessere Idee. Wobei ich nichtmal sicher bin ob es notwendig ist - könnte mir gut vorstellen dass die Ausgaben auch ohne freopen korrekt in der neu erzeugten Konsole landen.



  • @dd++:

    Vielen Dank! Das Beispiel sieht nicht sooo kompliziert aus und sollte einfach auszuprobieren sein. Mal sehen, welcher Bluescreen bei mir dabei herauskommt 😉

    @hustbaer:

    Das hat mich ja auch grade gewundert. Aber ich habs mehrmals probiert. Wenn ich Routinen von der Library aufrufe, ab dem ersten Aufruf keine Ausgabe. Wenn ich die Aufrufe auskommentiere, dann Ausgabe. Ansonsten wird das Programm normal beendet, es bleibt also nicht in einer Endlosschleife hängen.
    Aber egal, das war ja nur ein Randthema. Jedenfalls habe ich jetzt einen potenziellen Workaround.



  • Vielleicht wäre eine simple Datei logging.txt sinnvoll, in die du alles reinschreibst was dir wichtig erscheint. Diese Datei kannst du mit jedem Editor ansehen.
    Falls du das auch noch im Programm sehen möchtest, richtest du daür einen Button ein oder besser die Reaktion auf irgendeine Funktionstaste. Dann musst
    du die Datei zunächst schliessen, einlesen und geeignet in einem scrollable Fenster darstellen.

    Geht alles auch mit WinApi, kann aber erwas Mühe erfordern. :p



  • Und immer schön die Rückgabewerte überprüfen, bitte!



  • Welche Header muss ich denn inkludieren?

    > Executing: C:\Program Files (x86)\ConTEXT\ConExec.exe "g++" "VariablenTypen.cpp" -o -mwindows VariablenTypen.exe

    VariablenTypen.cpp: In function 'void InitConsole()':
    VariablenTypen.cpp:51:72: error: '_O_TEXT' was not declared in this scope
    VariablenTypen.cpp:51:79: error: '_open_osfhandle' was not declared in this scope
    > Execution finished.



  • #include <fcntl.h>
    #include <io.h>
    

Anmelden zum Antworten