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

德米特里J

有什么方法可以使用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如果使用命名管道而不是控制台句柄,则所有方法都可以正常工作。

所以我的问题是,是否有某种方法可以制造ReadFileExWriteFileEx使用控制台手柄。

哈里·约翰斯顿

Windows 10:

是。您可以CreateFile使用CONIN$CONOUT$FILE_FLAG_OVERLAPPED标记进行调用,它们都将正常工作。

Windows 7的:

否。控制台不支持重叠操作。

如果您已有使用ReadFileEx / WriteFileEx的代码,并且不想重写它,则可以将其传递给命名管道句柄,并让另一个线程(或进程)在命名管道的另一端与实际控制台之间传递数据。性能不是问题,因为控制台I / O是如此之慢,因此涉及到单独的线程并没有真正的危害。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Windows控制台应用程序中调试失败的文件句柄

带有控制台/节点的Elm中的Hello World

如何从带有Windows 7样式按钮的控制台应用程序中显示对话框?

带有多个项目和一个抽象工厂的控制台应用程序中的简单注入器

Python,Unicode和Windows控制台

在窗体模式下没有控制台窗口的混合Windows窗体和控制台应用程序

在firefox中,Web控制台和浏览器控制台有什么区别

启动时.NET中的控制台应用程序和Windows应用程序有什么区别

带有MVC,Ninject和WCF服务的控制台应用程序(处理问题?)

带有Java和Gradle的控制台应用程序

带有子进程和Popen的单独控制台窗口

带有WinForm和控制台界面的.Net程序

带有控制台日志和return关键字的不同join method()行为

带有尖括号和方括号的Chrome控制台对象属性

如何使用带有caliburn的应用程序同时用于控制台和WPF?

显示带有Spring Boot,Gradle和IDEA的控制台

带有类和仅显示整数的控制台程序

带有 Jenkins 的 VSTest 控制台-提供的源中没有可用的测试

ReadFileEx/WriteFileEx 不需要lpCompletionRoutine 和GetOverlappedResult 的使用吗?

通过带有“登录到控制台”的控制台显示标签

Serilog输出到控制台(带有ToString()数据)和seq(带有结构化数据)

使用Netbeans在C ++中仍显示带有WinMain入口点的控制台

带有Jenkins的xUnit:如何在构建控制台输出中显示颜色?

无法从控制台打开名称中带有空格的文件。为什么?

我怎么知道用户在带有ncurses的控制台(Linux)中按了ESC键?

控制台错误“未捕获的错误:在 webpackMissingModule 中找不到模块“/axios”,并带有反应

如何在Flutter中调用带有彩色文本的print()到Android Studio控制台

我如何在控制台C#中显示带有项目的List <object>

R中带有bootsempls的经验t值,将控制台输出转换为向量