2008-10-10 11 views

Antwort

0

Da ist kein Konsolenfenster, das ist unmöglich schwierig. (Lernen Sie jeden Tag etwas Neues - ich wusste nie etwas über die Konsolenfunktionen!)

Ist es möglich, dass Sie Ihre Ausgabeaufrufe ersetzen? Ich werde oft TRACE oder OutputDebugString verwenden, um Informationen an das Visual Studio-Ausgabefenster zu senden.

+2

Eigentlich ist es möglich, aber schwierig, ein Konsolenfenster für Programme zu erhalten, die den Einstiegspunkt WinMain() anstelle von main() verwenden. –

+0

@ChrisCharabaruk: Es ist nicht wirklich schwierig, [AllocConsole] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms681944.aspx) aufzurufen. Dies wird unter [Erstellen einer Konsole] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682528.aspx) erklärt. Außerdem steuert der Name des vom Benutzer bereitgestellten Einstiegspunkts nicht die Erstellung einer Konsole. Es ist der PE-Headereintrag für das Subsystem, das dies tut ("WINDOWS" vs. "CONSOLE"). Visual Studio verwendet diese Linkereinstellung, um zu steuern, welcher vom Benutzer bereitgestellte Eintrag den Startup-Code des CRT aufruft. – IInspectable

2

Zitieren Sie mich nicht auf diese, aber die Win32 console API könnte das sein, was Sie suchen. Wenn Sie dies nur für Debugging-Zwecke tun, sind Sie möglicherweise mehr daran interessiert, DebugView auszuführen und die DbgPrint-Funktion aufzurufen.

Dies setzt natürlich Ihre Anwendung voraus, dass Sie die Konsolenausgabe senden und nicht aus einer anderen Anwendung lesen möchten. In diesem Fall könnten Rohre dein Freund sein.

+0

Laut dem Link zu 'DbgPrint' gilt: 'Nur Kernel-Modus-Treiber können die DbgPrint-Routine aufrufen.' Also wahrscheinlich nicht, was die meisten Leute wollen – Paladin

+0

Huh. Nun, ich weiß, dass es eine Benutzermodus-Funktion zum Loggen von Nachrichten gibt, die in DebugView erscheinen. Ich dachte, dass DbgPrint es war, aber offensichtlich nicht. –

+0

Die Benutzermodusfunktion zum Ablegen von Text, der in DebugView angezeigt wird, ist [OutputDebugString] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363362.aspx). – IInspectable

19

Auschecken Adding Console I/O to a Win32 GUI App. Dies kann Ihnen helfen, das zu tun, was Sie wollen.

Wenn Sie den Code nicht haben oder nicht ändern können, versuchen Sie die Vorschläge here, Konsolenausgabe in eine Datei umzuleiten.


Edit: bisschen Thread Nekromantie hier. Ich habe zuerst vor 9 Jahren in den frühen Tagen von SO geantwortet, bevor die (gute) Politik der Nicht-Link-Only-Antworten in Kraft trat. Ich werde den Code aus dem Originalartikel in der Hoffnung, für meine vergangenen Sünden zu sühnen, erneut veröffentlichen.

guicon.cpp - Eine Konsolenumleitungsfunktion

#include <windows.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <io.h> 
#include <iostream> 
#include <fstream> 
#ifndef _USE_OLD_IOSTREAMS 
using namespace std; 
#endif 
// maximum mumber of lines the output console should have 
static const WORD MAX_CONSOLE_LINES = 500; 
#ifdef _DEBUG 
void RedirectIOToConsole() 
{ 
    int hConHandle; 
    long lStdHandle; 
    CONSOLE_SCREEN_BUFFER_INFO coninfo; 
    FILE *fp; 

    // allocate a console for this app 
    AllocConsole(); 

    // set the screen buffer to be big enough to let us scroll text 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); 
    coninfo.dwSize.Y = MAX_CONSOLE_LINES; 
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); 

    // redirect unbuffered STDOUT to the console 
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stdout = *fp; 
    setvbuf(stdout, NULL, _IONBF, 0); 

    // redirect unbuffered STDIN to the console 
    lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "r"); 
    *stdin = *fp; 
    setvbuf(stdin, NULL, _IONBF, 0); 

    // redirect unbuffered STDERR to the console 
    lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stderr = *fp; 
    setvbuf(stderr, NULL, _IONBF, 0); 

    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog 
    // point to console as well 
    ios::sync_with_stdio(); 
} 

#endif 
//End of File 

guicon.h - Schnittstelle Umleitung Funktion zu trösten

#ifndef __GUICON_H__ 
#define __GUICON_H__ 
#ifdef _DEBUG 

void RedirectIOToConsole(); 

#endif 
#endif 

// End of File 

test.cpp - Demonstrieren Konsolenumleitung

#include <windows.h> 
#include <iostream> 
#include <fstream> 
#include <conio.h> 
#include <stdio.h> 
#ifndef _USE_OLD_OSTREAMS 
using namespace std; 
#endif 
#include "guicon.h" 


#include <crtdbg.h> 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 
{ 
    #ifdef _DEBUG 
    RedirectIOToConsole(); 
    #endif 
    int iVar; 

    // test stdio 
    fprintf(stdout, "Test output to stdout\n"); 
    fprintf(stderr, "Test output to stderr\n"); 
    fprintf(stdout, "Enter an integer to test stdin: "); 
    scanf("%d", &iVar); 
    printf("You entered %d\n", iVar); 

    //test iostreams 
    cout << "Test output to cout" << endl; 
    cerr << "Test output to cerr" << endl; 
    clog << "Test output to clog" << endl; 
    cout << "Enter an integer to test cin: "; 
    cin >> iVar; 
    cout << "You entered " << iVar << endl; 
    #ifndef _USE_OLD_IOSTREAMS 

    // test wide iostreams 
    wcout << L"Test output to wcout" << endl; 
    wcerr << L"Test output to wcerr" << endl; 
    wclog << L"Test output to wclog" << endl; 
    wcout << L"Enter an integer to test wcin: "; 
    wcin >> iVar; 
    wcout << L"You entered " << iVar << endl; 
    #endif 

    // test CrtDbg output 
    _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); 
    _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); 
    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); 
    _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); 
    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); 
    _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); 
    _RPT0(_CRT_WARN, "This is testing _CRT_WARN output\n"); 
    _RPT0(_CRT_ERROR, "This is testing _CRT_ERROR output\n"); 
    _ASSERT(0 && "testing _ASSERT"); 
    _ASSERTE(0 && "testing _ASSERTE"); 
    Sleep(2000); 
    return 0; 
} 

//End of File 
+6

http://www.gamedev.net/community/forums/topic.asp?topic_id=509479&whichpage=1� –

+1

Guter Link. Die Foren von gamedev.net haben mir immer eine Fülle von Informationen zur Verfügung gestellt. – luke

+0

Die Links können hilfreich sein, aber diese Antwort enthält keine weiteren Informationen als diese Links. Wenn diese unzugänglich werden, ist diese Antwort nicht mehr hilfreich. – IInspectable

9

Sie können auch die Cout- und Cerr-Streams erneut öffnen, um sie in eine Datei auszugeben. Folgendes sollte für diese Arbeit:

#include <iostream> 
#include <fstream> 

int main() 
{ 
    std::ofstream file; 
    file.open ("cout.txt"); 
    std::streambuf* sbuf = std::cout.rdbuf(); 
    std::cout.rdbuf(file.rdbuf()); 
    //cout is now pointing to a file 
    return 0; 
} 
3

ein Rohr zu schaffen, führt die Programmkonsole Createprocess() und mit Readfile() oder schreibt in Konsole Writefile()

HANDLE hRead ; // ConsoleStdInput 
    HANDLE hWrite; // ConsoleStdOutput and ConsoleStdError 

    STARTUPINFO   stiConsole; 
    SECURITY_ATTRIBUTES segConsole; 
    PROCESS_INFORMATION priConsole; 

    segConsole.nLength = sizeof(segConsole); 
    segConsole.lpSecurityDescriptor = NULL; 
    segConsole.bInheritHandle = TRUE; 

if(CreatePipe(&hRead,&hWrite,&segConsole,0)) 
{ 

    FillMemory(&stiConsole,sizeof(stiConsole),0); 
    stiConsole.cb = sizeof(stiConsole); 
GetStartupInfo(&stiConsole); 
stiConsole.hStdOutput = hWrite; 
stiConsole.hStdError = hWrite; 
stiConsole.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 
stiConsole.wShowWindow = SW_HIDE; // execute hide 

    if(CreateProcess(NULL, "c:\\teste.exe",NULL,NULL,TRUE,NULL, 
     NULL,NULL,&stiConsole,&priConsole) == TRUE) 
    { 
     //readfile and/or writefile 
}  

}

1

gelesen Wechseln Sie zu Projekt> Projekteigenschaften> Linker> System, und setzen Sie im rechten Bereich SubSystems auf Konsole (/ SUBSYSTEM: CONSOLE)

Dann kompilieren Sie Ihr Programm und führen Sie es von der Konsole aus, um zu sehen, ob Ihre Eingabeaufforderung Ihre Ausgaben zeigt oder nicht.

2

Wenn Sie die Ausgabe Ihres Programms an eine Datei oder Pipe senden, z.

myprogram.exe > file.txt 
myprogram.exe | anotherprogram.exe 

oder Sie sich berufen Ihr Programm aus einem anderen Programm und dessen Ausgang über eine Leitung aufnehmen, dann brauchen Sie nichts zu ändern. Es wird einfach funktionieren, auch wenn der Einstiegspunkt WinMain ist.

Wenn Sie Ihr Programm jedoch in einer Konsole oder in Visual Studio ausführen, wird die Ausgabe nicht in der Konsole oder im Ausgabefenster von Visual Studio angezeigt. Wenn Sie die Ausgabe "live" sehen möchten, versuchen Sie eine der anderen Antworten.

Im Grunde bedeutet dies, dass die Standardausgabe genau wie bei Konsolenanwendungen funktioniert, aber nicht mit einer Konsole verbunden ist, auf der Sie Ihre Anwendung ausführen, und es scheint keinen einfachen Weg zu geben (alle anderen) Die hier vorgestellten Lösungen verbinden die Ausgabe mit einem neuen Konsolenfenster, das beim Ausführen Ihrer Anwendung angezeigt wird, selbst von einer anderen Konsole aus.

2

Die Verwendung einer Kombination von luke's answer und Roger's answer here funktionierte für mich in meinem Windows Desktop Application-Projekt.

void RedirectIOToConsole() { 

    //Create a console for this application 
    AllocConsole(); 

    // Get STDOUT handle 
    HANDLE ConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
    int SystemOutput = _open_osfhandle(intptr_t(ConsoleOutput), _O_TEXT); 
    FILE *COutputHandle = _fdopen(SystemOutput, "w"); 

    // Get STDERR handle 
    HANDLE ConsoleError = GetStdHandle(STD_ERROR_HANDLE); 
    int SystemError = _open_osfhandle(intptr_t(ConsoleError), _O_TEXT); 
    FILE *CErrorHandle = _fdopen(SystemError, "w"); 

    // Get STDIN handle 
    HANDLE ConsoleInput = GetStdHandle(STD_INPUT_HANDLE); 
    int SystemInput = _open_osfhandle(intptr_t(ConsoleInput), _O_TEXT); 
    FILE *CInputHandle = _fdopen(SystemInput, "r"); 

    //make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well 
    ios::sync_with_stdio(true); 

    // Redirect the CRT standard input, output, and error handles to the console 
    freopen_s(&CInputHandle, "CONIN$", "r", stdin); 
    freopen_s(&COutputHandle, "CONOUT$", "w", stdout); 
    freopen_s(&CErrorHandle, "CONOUT$", "w", stderr); 

    //Clear the error state for each of the C++ standard stream objects. We need to do this, as 
    //attempts to access the standard streams before they refer to a valid target will cause the 
    //iostream objects to enter an error state. In versions of Visual Studio after 2005, this seems 
    //to always occur during startup regardless of whether anything has been read from or written to 
    //the console or not. 
    std::wcout.clear(); 
    std::cout.clear(); 
    std::wcerr.clear(); 
    std::cerr.clear(); 
    std::wcin.clear(); 
    std::cin.clear(); 

} 
+0

Ausgezeichnete Lösung. –

Verwandte Themen