Windows - наследовать дескриптор файла консоли в дочернем процессе

0

У меня есть приложение Windows (subsystem=windows, а не консольное приложение). Я создаю консоль в этом приложении, а затем создаю дочерний процесс. Когда я создаю консоль, я делаю дескриптор файла консоли наследуемым (см. Ниже). Когда я создаю дочерний процесс, я устанавливаю для аргумента bInheritHandles CreateProcess значение TRUE. Я хочу, чтобы дочерний процесс мог читать и писать с консоли, но я получаю ошибку 0x06, invalid handle.

Я делаю следующее:

1) AllocConsole();

2) CreateFile("CONIN$",...), CreateFile("CONOUT$",...) или CreateConsoleScreenBuffer(...) со следующим SetConsoleActiveScreenBuffer(...). Всегда имеют bInheritHandle=TRUE SecurityAttributes с bInheritHandle=TRUE. но см. bInheritHandle=1.

3) CreateProcess(NULL, GetCommandLine(), NULL, NULL, TRUE,/* inherit handles */0, NULL, NULL, &sinfo, &child);

В дочернем процессе:

1) _open_osfhandle((intptr_t)console_handle, 0) дает мне -1 и GetLastError() возвращает ошибку 0x06 - "Invalid handle".

Детский процесс является копией его родителя, поэтому оба процесса имеют одну и ту же подсистему: windows (не консольное приложение).

Я проверил, что другие дескрипторы файлов наследуются нормально и могут использоваться с fdopen(_open_osfhandle(file_handle),...). Например, он работает для текстового файла. Но это не работает для консольного дескриптора.

Что я делаю неправильно?

  • 0
    Непонятно, что вы делаете на шаге 2 или откуда дочерний процесс получает значение console_handle . Пожалуйста, покажите какой-то фактический код.
  • 1
    Дескрипторы консоли - это псевдо-дескрипторы, которые относятся к консоли текущего процесса. Если дочерний процесс является приложением Windows, то при запуске у него не будет консоли, поэтому дескриптор, который ссылается на текущую консоль, не имеет смысла.
Показать ещё 1 комментарий
Теги:
winapi

1 ответ

0

Да, arx (см. Комментарии выше) absolutelly right: console file handle - это "поддельный" дескриптор, поскольку он не существует на уровне ОС (и не может быть унаследован). Этот тип дескриптора файла известен только для библиотек Win32 api (kernel32.dll) и запросов ввода-вывода, обработанных только на этом уровне. В Windows нет реальных файлов консоли, как виртуальных терминалов в Unix (кроме Windows8). :-( Итак, мне нужно изменить подсистему моего приложения из типа "windows" на "console", а затем приложение может использовать предварительно выделенную консоль (но дескриптор файла все еще не может быть унаследован - необходимо повторно открыть "CONOUT $", в детском процессе...)

Ещё вопросы

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