[winAPI] Konsole für Debug-Ausgabe

uhu01

Erfahrenes Mitglied
Hy!

Hab mal wieder eine Frage:
Wie kann ich ein in einer winAPI Anwendung ein Konsolenfenster öffnen, um Debug-Ausgaben zu machen? Das Problem ist nämlich, dass ich einige Ausgaben benötige, MessageBoxen gehen nicht, da es vorkommen kann das pro Sekunde 30 Ausgaben kommen, und ich das Programm dann nur noch per TaskManager beenden kann, es sollte jedoch trotz des Fehlers weiterlaufen. In API-Fenster selbst kann ich's nicht reinschreiben, da das schon fast voll ist, und in ein Logfile ist auch blöd, da ich mit selbstgebauter Hardeware arbeite, und je nach Ausgabe bei der Hardeware was anderes machen möchte.

Gibt es eine Möglichkeit in einem winAPI Programm eine Konsole zu öffenen, und in diese zu schreiben?

mfg
uhu01
 
Es müßte funktionieren, wenn Du mit CreateProcess einen neuen Prozeß erzeugst, dem Du als Kommandozeile "CMD" mitgibst um die Konsole zu starten und eine Pipe erzeugst, die Du dem Prozeß als Standardeingabe gibst. Dann schreibst Du von Deinem Programm "echo"-Kommandos in diese Pipe und die Konsole sollte es anzeigen.
Code:
STARTUPINFO si;
    PROCESS_INFORMATION pi;
    SECURITY_ATTRIBUTES sa;
    HANDLE hReadPipe, hWritePipe;
    BOOL bOK = TRUE;
    
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    
    //Pipes erzeugen
    sa.nLength=sizeof(sa);
    sa.bInheritHandle=TRUE;
    sa.lpSecurityDescriptor=NULL;
    bOK = CreatePipe(&hReadPipe, &hWritePipe, &sa, 1048576);
    if(!bOK)
    {
    	//FEHLER
    }
    
    //Pipes eintragen
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.hStdInput = hReadPipe;
    si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);;
    si.hStdError = GetStdHandle(STD_OUTPUT_HANDLE);;
    si.wShowWindow = SW_SHOWMINNOACTIVE;
    
    //Prozess starten
    bOK = CreateProcess(NULL, 
 					"CMD",
    					NULL,
    					NULL,
    					TRUE,
 					NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE,
    					NULL,
    					NULL,
 					&si,
 					&pi);
    if(!bOK)
    {
    	//FEHLER
    }
Schreiben tust Du dann einfach mit WriteFile(hWritePipe,......).
Allerdings übernehme ich keine Garantie :)! Bitte schreib dann, ob's geklappt hat.
 
Hy!

Danke für die Vorschläge, das mit dem CreateProcess hat leider nicht funktioniert.
Mit AllocConsole() hat's wunderbar geklappt. Ich hätte jedoch noch eine Frage dazu:
Wie kann ich es erreichen das die Objekte cout und cerr mit dieser Konsole funktionieren? Momentan muss ich jede Ausgabe mit WriteConsole machen, was für Debug-Ausgaben ein bisschen umständlich ist, wegen wsprintf()...
Lt. MSDN sollten die Standard Ausgabe und Standard-Fehler-Ausgabe automatisch auf die erstellte Konsole umgeleitet werden, oder hab ich da etwas übersehen?

mfg
uhu01
 
Schade dass das mit Create Process nicht hingehauen hat. Aber ich denke, AllocConsole ist auch einfacher :)
 

Neue Beiträge

Zurück