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