Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Создать консоль и использовать его поток вывода.


Автор: Neitron 13.10.2005, 09:15
Давно пора в качестве отладочного потока использовать консоль.
Подскажите пожалуйста, как направить поток вывод именно в мной созданую консоль через CreateProcess

Автор: srd 13.10.2005, 09:46
Замем CreateProcess? Вот, наваял примерчик - GUI приложение создает консоль и выводит в неё текст.
Код

#define WIN32_LEAN_AND_MEAN
#include <tchar.h>
#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
{
    switch( msg )
    {
    case WM_CREATE:
        {
            // Создаём консольное окно
            AllocConsole();

            // Прикручиваем созданную консоль к стандартному потоку вывода
            int handle = _open_osfhandle( reinterpret_cast<long>( GetStdHandle( STD_OUTPUT_HANDLE ) ), _O_TEXT );
            *stdout = *_fdopen( handle, "w" );
            setvbuf( stdout, NULL, _IONBF, 0 );            
        }
        break;

    case WM_LBUTTONDOWN:
        {
            // Выводим текст в консоль при нажатии левой кнопки мыши
            printf(" WM_LBUTTONDOWN (x=%d, y=%d)\n", (int)(LOWORD(lparam)), (int)(HIWORD(lparam)) );
        }
        break;

    case WM_DESTROY:
        {
            FreeConsole();
            PostQuitMessage(0);
        }
        break;

    default:
        return DefWindowProc( hwnd, msg, wparam, lparam );
    }

    return 0L;
}

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow )
{
    WNDCLASSEX wc    = {0};

    wc.cbSize        = sizeof( wc );
    wc.hbrBackground = GetSysColorBrush( COLOR_WINDOW );
    wc.hCursor       = LoadCursor( NULL, IDC_ARROW );
    wc.hInstance     = hInstance;
    wc.lpfnWndProc   = WndProc;
    wc.lpszClassName = _T("DummyClass");
    wc.style         = CS_HREDRAW | CS_VREDRAW;

    RegisterClassEx( &wc );

    HWND hwnd = CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, wc.lpszClassName, _T("Example"), WS_OVERLAPPEDWINDOW,
                                CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL );
    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );

    MSG msg = {0};

    while( GetMessage( &msg, NULL, 0U, 0U ) )
    {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }

    return static_cast<int>( msg.wParam );
}


Автор: Neitron 13.10.2005, 10:11
Что-то у меня твой пример не особо работать стал, не отправлял он у меня ничего,
да и лень было разбираться, почему у меня никак у людей.
Ты мне подкинул идею. Сделал так.
Код

        AllocConsole();
        WriteConsole(GetStdHandle( STD_OUTPUT_HANDLE ),"sssssssssss",10,0,NULL);

Автор: srd 13.10.2005, 10:21
Цитата(Neitron @ 13.10.2005, 18:11)
Что-то у меня твой пример не особо работать стал, не отправлял он у меня ничего,

Ну хз, у меня всё работало smile

Цитата(Neitron @ 13.10.2005, 18:11)

AllocConsole();
WriteConsole(GetStdHandle( STD_OUTPUT_HANDLE ),"sssssssssss",10,0,NULL);

Такой способ много лучше. Просто мне было интересно направить в созданную консоль стандартный поток вывода CRT.

Автор: Earnest 14.10.2005, 14:13
Цитата(srd @ 13.10.2005, 10:21)
Такой способ много лучше. Просто мне было интересно направить в созданную консоль стандартный поток вывода CRT.

Посмотри еще функции _CrtDebugReport и связанные с ней. Можно поставить хук, можно указать, куда выводить стандартную отладочную информацию (в т.ч. в окно, в файл, и т.д.) ... много чего.

Автор: Neitron 17.10.2005, 13:15
Цитата(Earnest @ 14.10.2005, 14:13)
Цитата(srd @ 13.10.2005, 10:21)
Такой способ много лучше. Просто мне было интересно направить в созданную консоль стандартный поток вывода CRT.

Посмотри еще функции _CrtDebugReport и связанные с ней. Можно поставить хук, можно указать, куда выводить стандартную отладочную информацию (в т.ч. в окно, в файл, и т.д.) ... много чего.

Ох, извращаться из-за отладочной информации?? Не моё)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)