MFC 匿名管道实现输出

管道技术(Pipe),是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。 管道可以是单向的:一端是只读的,另一端点是只写的; 也可以是双向的:管道的两端点既可读也可写。
    匿名管道(Anonymous Pipe)是在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。
    匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。
    实用:
    一些解压缩程序,本身没有解压的功能,而是调用DOS程序PKZIP完成对压缩包的解压缩。但是在程序运行时又没有DOS控制台的窗口出现,而且一切本应该在DOS下显示的信息都出现在了那个安装程序的一个文本框里。这种设计既美观又可以防止少数眼疾手快的用户提前关了你的DOS窗口。
    这就是用匿名管道技术实现这个功能的。
                               
---------------------------------------------------------------------------------------------------------------
                                         =============样例============
 
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();
}


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值