带有Windows控制台句柄的ReadFileEx和WriteFileEx

时间:2017-06-29 21:02:52

标签: c winapi

有没有办法使用APC完成例程异步读取和写入控制台,而无需创建新线程?就像使用命名管道一样。

问题是,在控制台的情况下,FILE_FLAG_OVERLAPPED功能会忽略CreateFile

修改即可。这是为了澄清我正在尝试做什么。 Windows提供了ReadFileExWriteFileEx功能,可用于Asynchronous Procedure Calls。这些函数的Documentaion说明了参数hFile

  

此参数可以是CreateFile函数使用FILE_FLAG_OVERLAPPED标志打开的任何句柄< ...>

然后,CreateFile的文档说如果将CONIN$CONOUT&传递给他们,则会忽略FILE_FLAG_OVERLAPPED

事实上,当我尝试遵循序列时:

HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
if(!WriteFileEx(h, ...)) {
   auto errorCode = GetLastError(); //I get 6 here
}

...我收到错误代码6 - ERROR_INVALID_HANDLE。如果使用命名管道而不是控制台句柄,那么一切都可以正常工作。

所以我的问题是,是否有某种方法可以使ReadFileExWriteFileEx与控制台句柄一起使用。

1 个答案:

答案 0 :(得分:2)

Windows 10:

是。您可以使用CreateFileCONIN$以及CONOUT$标记来呼叫FILE_FLAG_OVERLAPPED,这样就可以正常工作。

Windows 7:

没有。控制台不支持重叠操作。

如果你有使用ReadFileEx / WriteFileEx的现有代码并且不希望重写它,你可以传递一个命名管道句柄并让另一个线程(或进程)在命名管道的另一端和实际之间传递数据安慰。性能不是问题,因为无论如何控制台I / O都是如此之慢,因此在涉及单独的线程时没有真正的伤害。