2014-12-02 70 views
4

以下代码获取尝试执行的最后一行WIN7的boost :: ASIO:视窗:stream_handle构造函数会引发错误

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 

回答

3

您可以使用GetStdHandle,所以:

HANDLE isfhandle = GetStdHandle(STD_INPUT_HANDLE); 

不过,我不认为控制台支持异步IO在Windows中:

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

    如果提供了一个句柄,它必须已经被打开以实现重叠的I/O完成。例如,您必须使用CreateFile函数时获得手柄

    ,但进一步的文档进行的CreateFile说的CreateFile创建句柄到控制台缓冲区时忽略文件标志 指定FILE_FLAG_OVERLAPPED标志。

所以,你需要模拟标准输入/标准输出异步IO。


注意,在Linux,异步IO到标准IO处理只可能在某些情况下无论如何 - 取决于输入/输出重定向:Strange exception throw - assign: Operation not permitted