GUI / Konsolen Hybrid



  • So 🙂

    Die Devise is wiedermal: Hilf dir selbst, sonst hilft dir keiner 🙂
    Ich hab zumindest eine Teilloesung für mein Problem gefunden.
    Mit diesem Code hier gehts:

    #include <windows.h>
    #include "CMLParser.hpp"
    
    .......
    .......
    
    if(AllocConsole()) {
    			LPSTR lpszPrompt1 = "Type a line and press Enter, or q to quit: ";
    			DWORD cWritten;
    			HANDLE hConsoleOutput = NULL;			
    			hConsoleOutput	= GetStdHandle(STD_OUTPUT_HANDLE);									
    			WriteFile( hConsoleOutput, lpszPrompt1, lstrlenA(lpszPrompt1), &cWritten, NULL);					
    			MessageBox(NULL, NULL, NULL, NULL);
    			return true;
    		}
    

    Wenn ich nun das Programm aus der Konsole aufrufe hab nur noch das Problem das ich dann zwei Consolen habe. Einmal die aufrufende shell und meine neue konsole in welche jetzt endlich mein text geschrieben wird 🙂
    Ich hätte gerne aber in die aufrufende Konsole geschrieben. Laut MSDN nimmt man dafür in der Regel AttachConsole(ATTACH_PARENT_PROCESS);
    Und hier liegt genau der Hund begraben. Er findet die Funktion AttachConsole in meinem VisualStudio einfach nicht...
    Muss ich dafür was besonderes inkludieren ?



  • das geht glaub ich nicht weil wenn du ein programm mit subsystem windows startest wartet der kommandozeileninterpreter nicht auf dein programm.



  • Naja aber alle anderen scheinen das ja auch zu machen, wieso klappt das dann bei mir nicht ?
    Hast du eine Idee was ich da machen kann ?



  • dann musse ne konsolenanwendung erstellen und dort dein fenster öffnen



  • Nein, es geht definitv auch anders. Windows kann sowas machen. Das hab ich gelesen. Es gibt da leider nur kein brauchbares Beispiel. Wenn der bei mir AttachConsole finden würde würde das bestimmt gehen, aber obwohl ich <windows.h>
    eingebunden habe findet der die API nicht. Das is schon sehr komisch, da das nichts mit dem Subsystem zu tun haben kann...
    Naja ich werd schon noch ne die Lösung finden.

    Danke trotzdem.



  • selbst wenn es geht dann ist das doch super unsauber. der kommandozeileninterpreter wartet auf neue eingaben und du willst dann da einfach deine ausgaben rein machen??



  • Also ich bin nicht unbedingt der Meinung, dass das unsauber is. Später soll ein Buildsystem aus der Konsole heraus meine Applikation aufrufen. Damit das Buildsystem mit den Rückgaben meiner Applikation arbeiten kann muss die Rückgabe im Caller-Fenster stattfinden.

    Vielleicht verstehe ich aber auch nich ganz was du mit unsauber meinst...

    Gruß Ben.



  • Das hier

    http://cygwin.com/ml/cygwin/2004-05/msg00215.html

    in einem eigenen WinThread verpackt sollte Deine Anfoderung abdecken.

    Grüsse

    *this

    P.S. : Unsauber finde ich daran gar nichts.



  • #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	AttachConsole(ATTACH_PARENT_PROCESS);
    	DWORD numberOfCharsWritten;
    	WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), L"Hello", 5, &numberOfCharsWritten, NULL);
    }
    

    erzeugt folgendes:

    http://img485.imageshack.us/img485/8128/testjz0.png



  • gmfghj schrieb:

    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	AttachConsole(ATTACH_PARENT_PROCESS);
    	DWORD numberOfCharsWritten;
    	WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), L"Hello", 5, &numberOfCharsWritten, NULL);
    }
    

    erzeugt folgendes:

    http://img485.imageshack.us/img485/8128/testjz0.png

    Das scheint aber nur dann zu funktionieren wenn der PARENT_PROCESS auch eine Konsole iitialisiert hat; in dem Beispiel aus dem Screendump macht das die cmd.

    Beim Aufruf aus einer Fensteranwendung (z.B. VS Debugger) schlägt AttachConsole fehl mit Last Error = INVALID_HANDLE.

    Grüsse

    *this


Anmelden zum Antworten