gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:28 27 4
gpt4 key购买 nike

有没有什么方法可以在不创建新线程的情况下使用 APC 完成例程异步读取和写入控制台?就像命名管道一样。

问题是在控制台的情况下,FILE_FLAG_OVERLAPPEDCreateFile 函数忽略。

编辑。这是为了澄清,我想做什么。Windows 提供函数 ReadFileExWriteFileEx 来处理 Asynchronous Procedure Calls .这些函数的文档说明了参数 hFile:

This parameter can be any handle opened with the FILE_FLAG_OVERLAPPED flag by the CreateFile function<...>

然后,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 与控制台句柄一起工作。

最佳答案

Windows 10:

是的。您可以使用 CONIN$CONOUT$FILE_FLAG_OVERLAPPED 标志调用 CreateFile,一切都会正常工作。

Windows 7:

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

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

关于c - Windows 中带有控制台句柄的 ReadFileEx 和 WriteFileEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44834951/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com