win7 boost :: asio :: windows :: stream_handle构造函数抛出错误

时间:2014-12-02 20:20:14

标签: 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 = (HANDLE)_get_osfhandle(inFD);//osfhandle is valid

 boost::asio::windows::stream_handle inputStream(*ioServicePtr, osfhandle); //error

错误是:

uncaught exception of type N5boost16exception_detail10clone_implINS0_19error_info_injectorINS_6system12system_errorEEEEE
- assign: The parameter is incorrect

感谢您的意见。

@sehe

我试过

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

1 个答案:

答案 0 :(得分:3)

您可以使用GetStdHandle,所以:

HANDLE isfhandle = GetStdHandle(STD_INPUT_HANDLE);

但是,我不认为控制台支持Windows中的异步IO:

  • 句柄必须是支持重叠I / O的对象。

      

    如果提供了句柄,则必须打开它才能完成重叠的I / O.例如,你必须   使用CreateFile函数获取句柄

    时指定FILE_FLAG_OVERLAPPED标志

    但是,CreateFile的文档还说CreateCile在创建控制台缓冲区的句柄时会忽略文件标志。

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


请注意,在Linux上,只能在某些情况下使用标准IO句柄的异步IO - 具体取决于重定向的输入/输出:Strange exception throw - assign: Operation not permitted