GUI / Konsolen Hybrid



  • Hallo,

    ich habe zur Zeit folgendes Problem: Ich versuche gerade eine Windows-Anwendung zu programmieren, welche sowohl in einem Textfeld als auch auf der Konsole Meldungen ausgeben kann.

    Hat jemand eine Idee wie man das macht, das mit der GUI ist kein Problem. Aber die Ausgabe auf die Konsole will nicht so recht klappen. cout hab ich schon versucht....

    cout << "test";

    Gibt auf der Konsole nix aus.

    Danke für eure Hilfe,

    G.Ben

    PS: So sieht mein Code in etwa aus...

    BOOL CALLBACK MainDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {	
    	if(Message==WM_INITDIALOG) {			
    		return 0;	
        }else if (Message==WM_COMMAND) {		
    
    	} else if(Message==WM_CLOSE) {
    		DestroyWindow( hwnd );
    		return 0;
    	} else if(Message==WM_DESTROY) {
    		PostQuitMessage (0);
    		return 0;
    	} else {
    		return FALSE;
    	}	
    	return TRUE;
    }
    
    int WINAPI WinMain(	HINSTANCE	hInstance, 
    					HINSTANCE hPrevInstance,
    					LPSTR lpCmdLine, 
    					int nCmdShow) { 	
    
    	/* save main instance of the application
    	 */
    	global_hInstance	= hInstance;	
    
    	/* generate cml parser object and verfify whether a valid
    	 * commandline is passed...
    	 */	
    	cmlParser = new CMLParser(lpCmdLine, blahha);	
    
    	if(!cmlParser->verifyCML()) {		
    		return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc);
    	} 
    
    	return 0;
    }
    


  • Hallo nochmal,

    ich hab es mittlerweile so versucht, das scheint die gängige Methode zu sein...

    if(AllocConsole()) {
    			HANDLE hConsoleInput = NULL;
    			HANDLE hConsoleOutput = NULL;			
    
    			hConsoleInput	= GetStdHandle(STD_INPUT_HANDLE);
    			hConsoleOutput	= GetStdHandle(STD_OUTPUT_HANDLE);
    
    			if(hConsoleInput == INVALID_HANDLE_VALUE || hConsoleOutput == INVALID_HANDLE_VALUE) {
    				return false;
    			}
    
    			DWORD dw;
    			WriteConsole (hConsoleOutput, "Hello", strlen ("Hello"), &dw, 0);
    
    			MessageBox(NULL, NULL, NULL, NULL);
    			return true;
    		}
    

    Aber hier bekomme ich nur Hyroglyphen auf der Console....



  • 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