Win32:不可能将 iocp 与标准输入句柄一起使用
Posted
技术标签:
【中文标题】Win32:不可能将 iocp 与标准输入句柄一起使用【英文标题】:Win32: Impossible to use iocp with stdin handle 【发布时间】:2019-04-10 18:56:42 【问题描述】:我想使用 I/O 完成端口在 Windows 中的标准输入上进行异步读取,但此代码不起作用:
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "Kernel32.lib")
int main()
HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD number;
HANDLE iocp = CreateIoCompletionPort(handle, NULL, 0, 0);
if(iocp == NULL)
printf("error : %d\n", GetLastError());
我收到错误 87:ERROR_INVALID_PARAMETER
【问题讨论】:
IOCP 需要使用异步打开的文件句柄。我不相信用异步打开标准输入/标准输出是可能的。 我没有找到任何可以异步打开标准输入的东西... 如果您只针对最新的 Windows 版本 (8+),您需要CreateFile(L"CONIN$", FILE_GENERIC_READ, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
而不是 GetStdHandle(STD_INPUT_HANDLE);
在此之后您可以使用 CreateIoCompletionPort
但更好,只需在此处使用 BindIoCompletionCallback
。另一个问题,你想要这里的一般逻辑骨架
【参考方案1】:
CreateIOCompletionPort 不能直接与 stdin/stdout 一起使用。 检查this。要么使用线程,要么将标准输入/标准输出重定向到命名管道。
【讨论】:
谢谢!我想我会创建一个线程...与 UNIX API 相比,Windows API 很奇怪 在编写windows时忘记所有来自unix的东西,并且将std::thread用于简单线程。 真的可以用。我们可以在异步模式CreateFile(L"CONIN$", FILE_GENERIC_READ, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
下打开控制台,然后通过BindIoCompletionCallback
将其绑定到iocp 或更好。但这将适用于 win7 或 win8(已经忘记),当控制台模型更改并且控制台句柄不是真正的文件句柄时以上是关于Win32:不可能将 iocp 与标准输入句柄一起使用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Win32 句柄在 C++ 中获取文件名? [复制]
python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入