windows 匿名管道读取子进程输出

    // Prepare pipe handles for standard output redirection 
    SECURITY_ATTRIBUTES saAttr; 
    // Set the bInheritHandle flag so pipe handles are inherited. 
    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
    saAttr.bInheritHandle = TRUE; 
    saAttr.lpSecurityDescriptor = NULL;
    HANDLE hReadPipe, hWritePipe;
    BOOL res = CreatePipe( &hReadPipe, &hWritePipe, &saAttr, 0 );
    if ( ! SetHandleInformation(hReadPipe, HANDLE_FLAG_INHERIT, 0) )
    {
        LOG(ERROR<<"SetHandleInfomation fail.");
    }

    string strOutFile;
    if ( !res )
    {
        return res;
    }
    else
    {
        STARTUPINFO si;
        memset( &si, 0, sizeof( si ) ); 
        si.cb = sizeof( si );
        GetStartupInfo(&si);
        // Hide DOS window
        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = SW_HIDE;
         si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        si.hStdOutput = hWritePipe;
        si.hStdInput = hReadPipe;
        si.hStdError = hWritePipe;
        PROCESS_INFORMATION pi;
        ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) );

        wstring sFullCommand = L"wmic diskdrive list";
        res = CreateProcess( NULL, (LPTSTR)(LPCTSTR)sFullCommand.c_str(), NULL, NULL, TRUE,
            0, NULL, NULL, &si, &pi );
        if (!res)
        {
            // process error of rsh
            LOG(ERROR<<"CreateProcess fail.");
            return ERR_ERROR;
        }
        else
        {
            // Close write pipe
            CloseHandle( hWritePipe );
            DWORD NumberOfBytesRead;
            char Buffer[ 257 ];
            while(::ReadFile( hReadPipe, Buffer, sizeof(Buffer)/sizeof(Buffer[ 0 ])-1, 
                &NumberOfBytesRead, NULL ) )
            {
                LOG(INFO<<Buffer<<" NumberOfBytesRead:"<<NumberOfBytesRead);
                if (NumberOfBytesRead)
                {
                    Buffer[ NumberOfBytesRead ] = TCHAR( 0 );
                    strOutFile += Buffer;
                }
                else
                    break;
            };
            LOG(INFO<<"LastError:"<<GetLastError());
            // Close read pipe and wait for the finish
            CloseHandle( hReadPipe );
            WaitForSingleObject( pi.hProcess, INFINITE );
            CloseHandle (pi.hProcess);
            res = TRUE;
        }
    }

参考:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

posted @ 2013-06-05 08:38  Max Woods  阅读(374)  评论(0编辑  收藏  举报