Что не так с моим кодом для подключения и использования консоли из другого процесса? - PullRequest
1 голос
/ 18 августа 2011

У меня есть серверный процесс, его выделение консоли и перенаправление вывода и ввод в эту консоль.С ShellExecute этот серверный процесс порождает некоторых клиентов, эти клиенты знают ProcessID сервера.Итак, я пробую AttachConsole со следующим классом:

Console::Console(DWORD dwProcessId)
{
    if (dwProcessId) {
        AttachConsole(dwProcessId);
    }
    else
        AllocConsole();

    CONSOLE_SCREEN_BUFFER_INFO coninfo;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
    coninfo.dwSize.Y = 500;
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);

    int hConHandle;
    long lStdHandle;
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    FILE *fp = _fdopen( hConHandle, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );

    std::ios::sync_with_stdio();
}

Console::~Console()
{
    FreeConsole();
}

Но он не работает, он даже стирает вывод на консоль из процесса сервера.Хм .. Может только один процесс может выводить на консоль.Можно ли отправить вывод на консоль из многих процессов?

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Вы должны открыть CONOUT$, используя CreateFile. Подключение к консоли не меняет дескрипторы starndard, которые унаследовал ваш процесс.

0 голосов
/ 19 августа 2011

Может кто-нибудь сказать мне, почему из-за следующих изменений мой код работает хорошо:

Console::Console(DWORD dwProcessId)
{
    if (dwProcessId) {
        AttachConsole(dwProcessId);
        HANDLE consoleHandle = CreateFileA("CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
        if (consoleHandle == INVALID_HANDLE_VALUE)
            throw 1;
        if (!SetStdHandle(STD_OUTPUT_HANDLE, consoleHandle)) 
            throw 2;
    }
    else {
        AllocConsole();
        CONSOLE_SCREEN_BUFFER_INFO coninfo;
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
        coninfo.dwSize.Y = 500;
        SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
    }


    int hConHandle;
    long lStdHandle;
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    FILE *fp = _fdopen( hConHandle, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );
    }

Теперь клиенты, созданные с помощью ShellExecute, могут писать в консоль сервера.

...