如何在CreateProcess()c ++之后为控制台获取GetStdHandle(STD_OUTPUT_HANDLE)

时间:2014-02-05 08:32:52

标签: c++ process

我正在使用CreateProcess()创建基于多个控制台的子进程。现在我有PI(进程信息)元素,如PID,PHandle,hThread,Threadid。是否可以使用这些元素为该控制台获取Std Handle。

我试过这段代码,但在文件中写了一些垃圾值

bool __fastcall ProcessController::StartProcess(unsigned short WindowPosition=0)
{
     PROCESS_INFORMATION pi;
     STARTUPINFO si = {sizeof(si)};
   si.dwFlags = STARTF_USESHOWWINDOW;
   si.wShowWindow = WindowPosition;

if(CreateProcess(NULL,TEXT(PName.t_str()),NULL,NULL,true,0,NULL,NULL,&si,&pi))
{

    PHandle         =       pi.hProcess;
    PId             =       pi.dwProcessId;
    PThreadHandle   =       pi.hThread;
    PThreadId       =       pi.dwThreadId;
    ////////////////////////////////
    HANDLE hOut;
    COORD location = {0, 0};
    char *buffer=NULL;
    DWORD numberRead;
    std::ofstream fileLog;

    buffer = new TCHAR[BUFFER_SIZE];
    fileLog.open ("C:\\Users\\SWDH\\Desktop\\hem.txt");
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    ReadConsoleOutputCharacter(hOut, buffer, BUFFER_SIZE, location,   &numberRead);
    fileLog << buffer ;
    free(buffer);
    fileLog.close();

    /////////////////////////////////
    SetWindowHandle();
    return true;
}
    }

1 个答案:

答案 0 :(得分:0)

我认为你正在寻找si.hStdOutput - 你刚刚开始的过程的标准。要填写此内容,请首先输入标记STARTF_USESTDHANDLES(在si.dwFlags中)。立即调用其他两个句柄上的CloseHandle,因为您不需要它们。阅读完孩子输出后,请关闭hStdOutput