有什么方法可以使用APC完成例程异步读取和写入控制台,而无需创建新线程?就像使用命名管道一样。
问题是在控制台的情况下,功能FILE_FLAG_OVERLAPPED
会忽略它CreateFile
。
编辑。这是为了澄清我要做什么。Windows提供了一些功能ReadFileEx
以及WriteFileEx
用于处理异步过程调用的功能。这些函数的文档说明了参数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
使用控制台手柄。
Windows 10:
是。您可以CreateFile
使用CONIN$
或CONOUT$
和FILE_FLAG_OVERLAPPED
标记进行调用,它们都将正常工作。
Windows 7的:
否。控制台不支持重叠操作。
如果您已有使用ReadFileEx / WriteFileEx的代码,并且不想重写它,则可以将其传递给命名管道句柄,并让另一个线程(或进程)在命名管道的另一端与实际控制台之间传递数据。性能不是问题,因为控制台I / O是如此之慢,因此涉及到单独的线程并没有真正的危害。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句