windows 匿名管道讀取子進程輸出

來源:互聯網
上載者:User

    // 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.