如何使用win32 API将stdin重定向到C中的文件?

如何使用win32 API将stdin重定向到C中的文件?,c,winapi,io-redirection,C,Winapi,Io Redirection,我试图将stdin重定向到我选择的一个文件中,在一个C程序(win32 API)中,这样就可以重定向stderr或stdout 我正在编写一个在cygwin上运行的shell,理想的效果是使用cat

我试图将stdin重定向到我选择的一个文件中,在一个C程序(win32 API)中,这样就可以重定向stderr或stdout

我正在编写一个在cygwin上运行的shell,理想的效果是使用cat 这是我目前的代码:

    static HANDLE createinputHandle(PCSTR filename, SECURITY_ATTRIBUTES sa)
    {
            return CreateFile(
                 filename,
                 GENERIC_READ,
                 FILE_SHARE_READ,
                 NULL,
                 OPEN_ALWAYS,
                 FILE_ATTRIBUTE_NORMAL,
                 NULL);
    }


    static VOID RedirectHandle(STARTUPINFO *psi, HANDLE hFile, INT opt)
    {
        if (hFile == INVALID_HANDLE_VALUE)
            return;

        psi->dwFlags |= STARTF_USESTDHANDLES;

        switch (opt) {
        case STD_INPUT_HANDLE:
            psi->hStdInput = GetStdHandle(STD_INPUT_HANDLE);
            psi->hStdInput = hFile;
            break;
        case STD_OUTPUT_HANDLE:
            psi->hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
            psi->hStdOutput = hFile;
            break;
        case STD_ERROR_HANDLE:
            psi->hStdError = GetStdHandle(STD_ERROR_HANDLE);
            psi->hStdError = hFile;
            break;
        }

command_func() {
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 bool result;
 DWORD wait_result;
 HANDLE inHandle, outHandle, errHandle;
 SECURITY_ATTRIBUTES sa;

 ZeroMemory(&si, sizeof(si)); //macro to init with zero's
 si.cb = sizeof(si);
 ZeroMemory(&pi, sizeof(pi));
 ZeroMemory(&sa, sizeof(sa));
 sa.bInheritHandle = TRUE;

 inHandle = INVALID_HANDLE_VALUE;
 outHandle = INVALID_HANDLE_VALUE;
 errHandle = INVALID_HANDLE_VALUE;

     if(inputFile != NULL) {

        inHandle = createinputHandle(inputFile, sa);
            SetHandleInformation(inHandle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
            //added
        RedirectHandle(&si, inHandle, STD_INPUT_HANDLE);

     }


result = CreateProcess(
            NULL,
            cmd, /*if you want to test this, you need to change cmd to something like "ls -l" */
            NULL,
            NULL,
            TRUE,
            0,
            NULL,
            NULL,
            &si,
            &pi); 
}
这个stdin重定向不起作用,我做错了什么


谢谢大家!

您就快到了:)使用:
::SetHandleInformation(在HANDLE中,HANDLE\u FLAG\u INHERIT,HANDLE\u FLAG\u INHERIT)

再次检查代码,我编辑了它,添加了您所说的内容,我要么不理解您所说的内容,要么我做了其他错误的事情嗯,我只是在第一次评论中说它不起作用。我还在创建过程后关闭句柄,所以这不是问题所在,所以在我的建议的顶部,在CreateFile的第四个参数处打开文件w/NULL security属性)createinputHandle()的ret值是多少?你确定这是一个有效的手柄吗?让我们