获取createprocess运行的命令行中产生的字符(Pipe方法)

感谢http://www.vckbase.com/english/code/misc/redirect.shtml.htm所提供的源码,或从以下链接下载

http://download.csdn.net/detail/sandro_zhang/3869045

主要函数整理如下。

void Redirect()
{
    wchar_t command_line[] = L"output.exe";
    HANDLE                    PipeReadHandle;
    HANDLE                    PipeWriteHandle;
    PROCESS_INFORMATION        ProcessInfo;
    SECURITY_ATTRIBUTES        SecurityAttributes;
    STARTUPINFO                StartupInfo;
    BOOL                    Success;

    //--------------------------------------------------------------------------
    //    Zero the structures.
    //--------------------------------------------------------------------------
    ZeroMemory( &StartupInfo,            sizeof( StartupInfo ));
    ZeroMemory( &ProcessInfo,            sizeof( ProcessInfo ));
    ZeroMemory( &SecurityAttributes,    sizeof( SecurityAttributes ));

    //--------------------------------------------------------------------------
    //    Create a pipe for the child's STDOUT.
    //--------------------------------------------------------------------------
    SecurityAttributes.nLength              = sizeof(SECURITY_ATTRIBUTES);
    SecurityAttributes.bInheritHandle       = TRUE;
    SecurityAttributes.lpSecurityDescriptor = NULL;

    Success = CreatePipe
    (
        &PipeReadHandle,        // address of variable for read handle
        &PipeWriteHandle,        // address of variable for write handle
        &SecurityAttributes,    // pointer to security attributes
        0                        // number of bytes reserved for pipe (use default size)
    );

    if ( !Success )
    {
        //ShowLastError(_T("Error creating pipe"));
        return;
    }    

    //--------------------------------------------------------------------------
    //    Set up members of STARTUPINFO structure.
    //--------------------------------------------------------------------------
    StartupInfo.cb           = sizeof(STARTUPINFO);
    StartupInfo.dwFlags      = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    StartupInfo.wShowWindow  = SW_HIDE;
    StartupInfo.hStdOutput   = PipeWriteHandle;
    StartupInfo.hStdError    = PipeWriteHandle;

    //----------------------------------------------------------------------------
    //    Create the child process.
    //----------------------------------------------------------------------------
    Success = CreateProcess
    (
        NULL,                    // pointer to name of executable module
        command_line,    // command line
        NULL,                    // pointer to process security attributes
        NULL,                    // pointer to thread security attributes (use primary thread security attributes)
        TRUE,                    // inherit handles
        0,                        // creation flags
        NULL,                    // pointer to new environment block (use parent's)
        NULL,    // pointer to current directory name
        &StartupInfo,            // pointer to STARTUPINFO
        &ProcessInfo            // pointer to PROCESS_INFORMATION
    );                 

    if ( !Success )
    {
        //ShowLastError(_T("Error creating process"));
        return;
    }

    DWORD    BytesLeftThisMessage = 0;
    DWORD    NumBytesRead;
    TCHAR    PipeData[BUF_SIZE] = {0};
    DWORD    TotalBytesAvailable = 0;

    for ( ; ; )
    {
        NumBytesRead = 0;

        Success = PeekNamedPipe
        (
            PipeReadHandle,                // handle to pipe to copy from
            PipeData,                    // pointer to data buffer
            1,                            // size, in bytes, of data buffer
            &NumBytesRead,                // pointer to number of bytes read
            &TotalBytesAvailable,        // pointer to total number of bytes available
            &BytesLeftThisMessage        // pointer to unread bytes in this message
        );

        if ( !Success )
        {
            break;
        }

        if ( NumBytesRead )
        {
            Success = ReadFile
            (
                PipeReadHandle,        // handle to pipe to copy from
                PipeData,            // address of buffer that receives data
                BUF_SIZE - 1,        // number of bytes to read
                &NumBytesRead,        // address of number of bytes read
                NULL                // address of structure for data for overlapped I/O
            );

            if ( !Success )
            {
                break;
            }

            //------------------------------------------------------------------
            //    Zero-terminate the data.
            //------------------------------------------------------------------
            PipeData[NumBytesRead] = '\0';

            //------------------------------------------------------------------
            //    Replace backspaces with spaces.
            //------------------------------------------------------------------
            for ( DWORD ii = 0; ii < NumBytesRead; ii++ )
            {
                if ( PipeData[ii] == _T('\b') )
                {
                    PipeData[ii] = ' ';
                }
            }
            
            //------------------------------------------------------------------
            //    If we're running a batch file that contains a pause command,
            //    assume it is the last output from the batch file and remove it.
            //------------------------------------------------------------------
            TCHAR  *ptr = _tcsstr(PipeData, _T("Press any key to continue . . ."));
            if ( ptr )
            {
                *ptr = '\0';
            }

            /*
                Take the PipeData,if current process's unicode different with the child process,
                there should be handled appropriately.
                wstring data = string2wstring((LPCSTR)PipeData, BUF_SIZE);
            */
            cout << wstring2string( data );
        }
        else
        {
            //------------------------------------------------------------------
            //    If the child process has completed, break out.
            //------------------------------------------------------------------
            if ( WaitForSingleObject(ProcessInfo.hProcess, 0) == WAIT_OBJECT_0 )    //lint !e1924 (warning about C-style cast)
            {
                break;
            }
        }
        
    }

    //--------------------------------------------------------------------------
    //    Close handles.
    //--------------------------------------------------------------------------
    Success = CloseHandle(ProcessInfo.hThread);
    if ( !Success )
    {
        break;
    }

    Success = CloseHandle(ProcessInfo.hProcess);
    if ( !Success )
    {
        break;
    }

    Success = CloseHandle(PipeReadHandle);
    if ( !Success )
    {
        break;
    }

    Success = CloseHandle(PipeWriteHandle);
    if ( !Success )
    {
        break;
    }
}

 

posted on 2013-08-24 17:57  唸安。  阅读(473)  评论(0)    收藏  举报