2014-12-02 75 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