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

  • 相关阅读:
    第一次作业
    第0次作业
    第14、15周作业
    第七周作业
    第六周作业
    第四周作业
    第三周作业
    第4次作业
    第3次作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/3118276.html
Copyright © 2011-2022 走看看