【发布时间】:2014-11-15 15:24:01
【问题描述】:
我有一个 Windows 应用程序(subsystem=windows,不是控制台应用程序)。我正在该应用程序中创建一个控制台,然后创建一个子进程。当我创建控制台时,我使控制台文件句柄可继承(见下文)。创建子进程时,我将CreateProcess 的bInheritHandles 参数设置为TRUE。我希望子进程能够从控制台读取和写入,但我收到错误 0x06, invalid handle。
我执行以下操作:
1) AllocConsole();
2) CreateFile("CONIN$", ...)、CreateFile("CONOUT$", ...) 或
CreateConsoleScreenBuffer(...) 与以下 SetConsoleActiveScreenBuffer(...)。始终拥有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), ...)一起使用。例如,它适用于文本文件。但它不适用于控制台句柄。
我做错了什么?
【问题讨论】:
-
不清楚您在第 2 步中在做什么,或者子进程从何处获取
console_handle的值。请显示一些实际代码。 -
控制台句柄是指当前进程的控制台的伪句柄。如果子进程是一个 Windows 应用程序,那么当您启动它时它不会有控制台,因此引用当前控制台的句柄是没有意义的。
-
你在父编中调用
SetStdHandle()吗?并看到这个继承子gui中的控制台hg.netbeans.org/main-golden/file/2da7b1f9de9b/o.n.bootstrap/…
标签: c++ c windows winapi win32-process