有没有办法使用APC完成例程异步读取和写入控制台,而无需创建新线程?就像使用命名管道一样。
问题是,在控制台的情况下,FILE_FLAG_OVERLAPPED
功能会忽略CreateFile
。
修改即可。这是为了澄清我正在尝试做什么。
Windows提供了ReadFileEx
和WriteFileEx
功能,可用于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
。如果使用命名管道而不是控制台句柄,那么一切都可以正常工作。
所以我的问题是,是否有某种方法可以使ReadFileEx
和WriteFileEx
与控制台句柄一起使用。
答案 0 :(得分:2)
Windows 10:
是。您可以使用CreateFile
或CONIN$
以及CONOUT$
标记来呼叫FILE_FLAG_OVERLAPPED
,这样就可以正常工作。
Windows 7:
没有。控制台不支持重叠操作。
如果你有使用ReadFileEx / WriteFileEx的现有代码并且不希望重写它,你可以传递一个命名管道句柄并让另一个线程(或进程)在命名管道的另一端和实际之间传递数据安慰。性能不是问题,因为无论如何控制台I / O都是如此之慢,因此在涉及单独的线程时没有真正的伤害。