zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【HDOJ】2774 Shuffle
    【POJ】2170 Lattice Animals
    【POJ】1084 Square Destroyer
    【POJ】3523 The Morning after Halloween
    【POJ】3134 Power Calculus
    【Latex】如何在Latex中插入伪代码 —— clrscode3e
    【HDOJ】4801 Pocket Cube 的几种解法和优化
    【HDOJ】4080 Stammering Aliens
    【HDOJ】1800 Flying to the Mars
    SQL语法
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/3118276.html
Copyright © 2011-2022 走看看