管道技术(Pipe),是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。 管道可以是单向的:一端是只读的,另一端点是只写的; 也可以是双向的:管道的两端点既可读也可写。
---------------------------------------------------------------------------------------------------------------
void CRealTimeDisplay02Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString m_Host;
CString strCmd;
m_EditCmd.GetWindowTextA( strCmd );
m_Host = _T("c:\\windows\\system32\\") + strCmd; //strCmd = "ipconfig.exe"
//创建管道
HANDLE hReadPipe;
HANDLE hWritePipe;
SECURITY_ATTRIBUTES sat; //安全属性结构
sat.nLength = sizeof(SECURITY_ATTRIBUTES); //结构体大小
sat.bInheritHandle = true; //指出安全描述符的对象能否被新进程继承
sat.lpSecurityDescriptor = NULL; //安全描述符,NULL: 使用默认的
if( !CreatePipe( &hReadPipe, &hWritePipe, &sat, NULL ) )
{
MessageBox(_T("Create Pipe Error!"));
return;
}
//创建进程
STARTUPINFO startupinfo; //进程信息
PROCESS_INFORMATION pinfo;
startupinfo.cb = sizeof( STARTUPINFO ); //结构体大小
GetStartupInfo( &startupinfo ); //获取当前进程的信息
startupinfo.hStdError = hWritePipe;
startupinfo.hStdOutput = hWritePipe;
startupinfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
startupinfo.wShowWindow = SW_HIDE;
if( !CreateProcess(NULL, m_Host.GetBuffer(), NULL, NULL,
TRUE, NULL, NULL, NULL, &startupinfo, &pinfo) )
{
MessageBox(_T("create process error!"));
return;
}
CloseHandle( hWritePipe );
//获取管道信息
BYTE buffer[1024];
DWORD byteRead;
while( true )
{
RtlZeroMemory( buffer, 1024 );
if( ReadFile( hReadPipe, buffer, 1023, &byteRead, NULL ) == NULL )
{
break;
}
::SendMessage( m_EditResult, EM_SETSEL, -1, 0 );
::SendMessage( m_EditResult, EM_REPLACESEL, false, (long)buffer );
}
CloseHandle( hReadPipe );
m_Host.ReleaseBuffer();
}