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

C++ 重定向控制台I/O:SetHandleInformation失败,句柄无效,c++,winapi,C++,Winapi,我正试图找出如何调整此示例,以适应另一个流程中的文本框 不幸的是,读者似乎永远不会收到任何输入 进一步调试表明,对SetHandleInformation的调用总是会中止,并出现错误6:无效句柄。hPipeOutRd的值看起来并不坏,它类似于0x00000244 这再现了这个问题: int main(int argc, char *argv[]) { SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(SECURITY_ATTRIBUTES);

我正试图找出如何调整此示例,以适应另一个流程中的文本框

不幸的是,读者似乎永远不会收到任何输入

进一步调试表明,对
SetHandleInformation
的调用总是会中止,并出现
错误6:无效句柄
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;
}

知道为什么吗?

句柄已经是指针了。除非它是一个out参数,否则不能获取它的地址


只需将&out从SetHandleInformation调用中取出。

句柄已经是指针。除非它是一个out参数,否则不能获取它的地址


只需从SetHandleInformation调用中取出(&D)。

请使用,这对重新创建它没有多大帮助。您可以将变量les的地址传递给CreatePipe,因为它们是输出。利用SetHandleInformation输入句柄,因此传递其值。通过参数的类型和文档中的内容清楚地指出。仔细阅读。考虑定义严格。那么编译器就可以找到你的错误了。gentlemien,微软的演示代码中有一个bug,@antipattern发布的url重定向控制台窗口的输出。它是父/子管道i/o重定向的
样板代码。父进程永远挂起。解决方法是调用
CloseHandle(g_hchildsd_OUT_Wr)在进入毛发循环之前,在
ReadFromPipe
函数中。请使用,这对重新创建它没有多大帮助。您将变量les的地址传递给CreatePipe,因为它们是输出。利用SetHandleInformation输入句柄,因此传递其值。通过参数的类型和文档中的内容清楚地指出。仔细阅读。考虑定义严格。那么编译器就可以找到你的错误了。gentlemien,微软的演示代码中有一个bug,@antipattern发布的url重定向控制台窗口的输出。它是父/子管道i/o重定向的
样板代码。父进程永远挂起。解决方法是调用
CloseHandle(g_hchildsd_OUT_Wr)进入毛发循环之前,在
ReadFromPipe
函数中。