重定向控制台I / O:SetHandleInformation失败,句柄无效

时间:2017-03-03 17:08:09

标签: c++ winapi

我试图找出如何调整此示例以便redirect the output of a console window到另一个进程内的文本框。

不幸的是,似乎读者永远不会收到任何意见。

进一步调试显示对SetHandleInformation的调用始终以Error 6: Invalid Handle中止。 hPipeOutRd的值看起来不错,就像0x00000244。

这再现了这个问题:

int main(int argc, char *argv[])
{
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = NULL;

    int result = 0;
    HANDLE hPipeOutRd = INVALID_HANDLE_VALUE; // This end is passed to the pipe reader
    HANDLE hPipeOutWr = INVALID_HANDLE_VALUE; // This end is passed to the child process

    if ( result == 0 && !::CreatePipe( &hPipeOutRd, &hPipeOutWr, &sa, 4096 ) ) 
    {
        result = -1; 
        printf("Error: %u\r\n", GetLastError() ); 
    }
    if ( result == 0 && !::SetHandleInformation( &hPipeOutRd, HANDLE_FLAG_INHERIT, 0 ) ) // This fails with invalid handle
    {
        result = -1; 
        printf("Error: %u\r\n", GetLastError() );  
    }

    return result;
}

任何想法为什么?

1 个答案:

答案 0 :(得分:2)

HANDLE已经是一个指针。除非是out参数,否则你不会接受它的地址。

只需带上&超出你的SetHandleInformation调用。