Windows 7 win7 boost::asio::windows::stream\u句柄构造函数引发错误

Windows 7 win7 boost::asio::windows::stream\u句柄构造函数引发错误,windows-7,boost-asio,Windows 7,Boost Asio,以下代码在尝试执行最后一行时出错 boost::shared_ptr<boost::asio::io_service> ioServicePtr(new boost::asio::io_service()); //setup the terminal with stdin and stdout int inFD = ::dup(STDIN_FILENO); int outFD = ::dup(STDOUT_FILENO); HANDLE osfhandle = (HA

以下代码在尝试执行最后一行时出错

 boost::shared_ptr<boost::asio::io_service> ioServicePtr(new boost::asio::io_service());
 //setup the terminal with stdin and stdout

 int inFD = ::dup(STDIN_FILENO);

 int outFD = ::dup(STDOUT_FILENO);

 HANDLE osfhandle = (HANDLE)_get_osfhandle(inFD);//osfhandle is valid

 boost::asio::windows::stream_handle inputStream(*ioServicePtr, osfhandle); //error
感谢您的意见

@塞赫

我试过了

hstdhandle = GetStdHandle(STD_OUTPUT_HANDLE);
也犯了同样的错误

于是我试着

HANDLE handle= 
CreateFile(
    "CONIN$", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 
    FILE_FLAG_OVERLAPPED, NULL);
boost::asio::windows::stream_handle inputStream(*ioServicePtr, handle); 
错误是

-assign handle invalid

您可以使用
GetStdHandle
,因此:

HANDLE isfhandle = GetStdHandle(STD_INPUT_HANDLE);
但是,我认为控制台不支持windows中的异步IO:

  • 句柄必须指向支持重叠I/O的对象

    如果提供了句柄,则必须将其打开以完成重叠I/O。例如,你必须 使用CreateFile函数获取句柄时,指定
    文件\u标志\u重叠
    标志

    但是CreateFile的文档进一步指出,CreateFile在创建控制台缓冲区的句柄时忽略文件标志

因此,您需要模拟stdin/stdout异步IO


请注意,在Linux上,标准IO句柄的异步IO仅在某些情况下是可能的,具体取决于重定向的输入/输出:

HANDLE isfhandle = GetStdHandle(STD_INPUT_HANDLE);