Как получить выходные данные консоли в командной строке?

0

У меня есть приложение на базе Windows. Я заставил его работать как в GUI Mode Console Mode. В GUI mode или в GUI mode Console mode я подключаю Console с помощью AttachConsole() чтобы вывести выходные инструкции вывода на консоль. Теперь проблема в том, что мне не нужна новая консоль, пока я использую ее в console mode или из Command prompt. Предположим из командной строки, я запускаю ее как

d:\Project path > MyApp.exe consolemode **Enter**

Затем он вызывает другую консоль из-за Attachconsole(). Теперь, когда я отключил AttachConsole() он не выводит новую консоль, и она также не отображает вывод в командной строке. Но мое требование - показать вывод в commandprompt вместо того, чтобы выводить новую консоль во время выполнения команды comamnd.

Myapp.cpp
Winmain()
{
....
...
AttachConsole();
cout << "Console Attached \n";
// Some more output
}

Итак, когда я запускаю myapp.exe из команды promt d:\Project path > MyApp.exe consolemode **Enter** он присоединяет new console и печатает результат в новом окне консоли. Теперь мое требование - отключить AttachConsole(); и хотел видеть вывод в командной строке.

Myapp.cpp
Winmain()
{
....
...
//AttachConsole(); //Now I an disabling console
cout << "Console Attached \n";
// Some more output
}

Если вы посмотрите на код выше, я отключил AttachConsole(). Теперь хочу, когда я это сделаю,

d:\Project path > MyApp.exe consolemode **Enter** Выход будет в командной строке. как ниже

d:\Project path > MyApp.exe consolemode **Enter**
Console Attached
....
...
d:\Project path >

пожалуйста, помогите мне

Теги:
console
visual-c++
mfc
visual-studio-2010

2 ответа

1

Вы должны взять дескриптор текущего рабочего окна и работать над ним, чтобы не требовалось allocconsole. Также вы должны найти, где находится курсор, и указать, что ваш вывод должен быть там написан.

HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbi; 

void cp( HANDLE hConsole,wchar_t* output )
{


    DWORD cCharsWritten; 
    COORD  crCurr;
    GetConsoleScreenBufferInfo(hStdout, &csbi);
    crCurr = csbi.dwCursorPosition;

    std::wstring ss;
    ss=output;

    if( !WriteConsoleOutputCharacter( hConsole,       
                                ss.c_str(),     
                                (DWORD)ss.length(), 
                                crCurr,     
                                &cCharsWritten ))
    {
      return;
    }

}

int main( void )
{

    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hStdout, &csbi);

    function(hStdout,L"string");
    return 0;
}
0

Процесс может иметь только одну консоль. Поэтому, если уже есть консоль, AllocConsole завершится с ошибкой, но AttachConsole завершится успешно, если вы еще не подключены к консоли родительского процесса. Если вы запустите из командной строки, вы уже будете прикреплены к родительской консоли, которая будет cmd.exe, и AttachConsole также потерпит неудачу (если вы сначала не вызовете FreeConsole). Если консоли нет ("режим графического интерфейса"), то AllocConsole будет успешным (и так будет AttachConsole, если вы знаете PID процесса, в котором есть консоль, к которой вы можете подключиться, и у вас есть достаточные права доступа). Поэтому вам просто нужно сначала попробовать "Выделение", если это не удается, вызовите AttachConsole (-1), и если это не удается, вызовите AllocConsole (или FreeConsole, затем AttachConsole). Примечание: вам не нужно также называть AttachConsole, если вы создаете консоль через AllocConsole (AttachConsole используется только для подключения к другой консоли, обычно к консоли другого процесса).

Если вы не хотите использовать консоль cmd.exe в "консольном режиме", вы можете вызвать FreeConsole (после того, как вы определили, что уже есть консоль, вызывая отказ AllocConsole), то AllocConsole преуспеет. Эта FreeConsole не влияет на консоль родительского процесса.

Если вы хотите использовать стандартные функции вывода, такие как printf или cout, для записи на консоль, выделенную AllocConsole, или scanf для чтения с консоли при работе в режиме "GUI", вы должны явно установить стандартные дескрипторы следующим образом:

    freopen("CON", "w", stdout);
    freopen("CON", "w", stderr);
    freopen("CON", "r", stdin);

Не так давно я написал сообщение в блоге о том, как это сделать. Я понимаю, что он недоволен отправкой ссылок, но я думаю, вы найдете это полезным. Там есть решение Visual Studio для полного примера приложения, которое вы можете скачать: http://www.windowsinspired.com/how-to-add-a-debugging-console-to-a-windows-gui-application/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню