Windows - 在子进程中继承控制台文件句柄

时间:2014-11-15 15:24:01

标签: c++ c windows winapi win32-process

我有一个Windows应用程序(subsystem=windows,而不是控制台应用程序)。我正在该应用程序中创建一个控制台,然后创建一个子进程。当我创建控制台时,我使控制台文件句柄可继承(见下文)。当我创建子进程时,我将bInheritHandles的{​​{1}}参数设置为CreateProcess。我希望子进程能够从控制台读取和写入,但我收到错误TRUE0x06

我执行以下操作:

1)invalid handle

2)AllocConsole();CreateFile("CONIN$", ...)CreateFile("CONOUT$", ...) CreateConsoleScreenBuffer(...)以下SetConsoleActiveScreenBuffer(...)。始终SecurityAttributesbInheritHandle=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)给我-1GetLastError()返回错误0x06 - "Invalid handle"

子进程是其父进程的副本,因此两个进程都具有相同的子系统:windows(不是控制台应用程序)。

我已经检查过其他文件句柄是否正常继承,可以与fdopen(_open_osfhandle(file_handle), ...)一起使用。例如,它适用于文本文件。但它不适用于控制台处理。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

是的,arx(参见上面的评论)绝对正确:控制台文件句柄是“假”句柄,因为它在操作系统级别不存在(并且不能继承)。这种类型的文件句柄仅适用于Win32 api库(kernel32.dll)和仅在此级别处理的I / O请求。 Windows没有真正的控制台文件,作为Unix中的虚拟终端(Windows8除外)。 :-(所以,我需要将我的应用程序的子系统从“windows”类型更改为“console”,然后应用程序可以使用预先分配的控制台(但文件句柄仍然无法继承 - 需要重新打开“CONOUT $”在儿童过程中...)