How to read output from cmd.exe using CreateProcess() and CreatePipe()

后端 未结 6 1815
盖世英雄少女心
盖世英雄少女心 2020-12-09 12:02

How to read output from cmd.exe using CreateProcess() and CreatePipe()

I have been trying to create a child process executing c

6条回答
  •  攒了一身酷
    2020-12-09 12:22

    I too have same scenario. in my case from Lib, need to execute internal exe and read output. The following works without any issues.

      void executeCMDInNewProcessAndReadOutput(LPSTR lpCommandLine)
        {
            STARTUPINFO si;
            SECURITY_ATTRIBUTES sa;
            PROCESS_INFORMATION pi;
            HANDLE g_hChildStd_IN_Rd, g_hChildStd_OUT_Wr, g_hChildStd_OUT_Rd, g_hChildStd_IN_Wr;  //pipe handles
            char buf[1024];           //i/o buffer
    
            sa.nLength = sizeof(SECURITY_ATTRIBUTES);
            sa.bInheritHandle = TRUE;
            sa.lpSecurityDescriptor = NULL;
    
            if (CreatePipe(&g_hChildStd_IN_Rd, &g_hChildStd_IN_Wr, &sa, 0))   //create stdin pipe
            {
                if (CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &sa, 0))  //create stdout pipe
                {
    
                    //set startupinfo for the spawned process
                    /*The dwFlags member tells CreateProcess how to make the process.
                    STARTF_USESTDHANDLES: validates the hStd* members.
                    STARTF_USESHOWWINDOW: validates the wShowWindow member*/
                    GetStartupInfo(&si);
    
                    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
                    si.wShowWindow = SW_HIDE;
                    //set the new handles for the child process
                    si.hStdOutput = g_hChildStd_OUT_Wr;
                    si.hStdError = g_hChildStd_OUT_Wr;
                    si.hStdInput = g_hChildStd_IN_Rd;
    
                    //spawn the child process
                    if (CreateProcess(NULL, lpCommandLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE,
                        NULL, NULL, &si, &pi))
                    {
                        unsigned long bread;   //bytes read
                        unsigned long avail;   //bytes available
                        memset(buf, 0, sizeof(buf));
    
                        for (;;)
                        {
                            PeekNamedPipe(g_hChildStd_OUT_Rd, buf, 1023, &bread, &avail, NULL);
                            //check to see if there is any data to read from stdout
                            if (bread != 0)
                            {
                                if (ReadFile(g_hChildStd_OUT_Rd, buf, 1023, &bread, NULL))
                                {
                                    break;
                                }
                            }
                        }
    
                        //clean up all handles
                        CloseHandle(pi.hThread);
                        CloseHandle(pi.hProcess);
                        CloseHandle(g_hChildStd_IN_Rd);
                        CloseHandle(g_hChildStd_OUT_Wr);
                        CloseHandle(g_hChildStd_OUT_Rd);
                        CloseHandle(g_hChildStd_IN_Wr);
                    }
                    else
                    {
                        CloseHandle(g_hChildStd_IN_Rd);
                        CloseHandle(g_hChildStd_OUT_Wr);
                        CloseHandle(g_hChildStd_OUT_Rd);
                        CloseHandle(g_hChildStd_IN_Wr);
                    }
                }
                else
                {
                    CloseHandle(g_hChildStd_IN_Rd);
                    CloseHandle(g_hChildStd_IN_Wr);
                }
            }
        }
    

提交回复
热议问题