管道应用之捕获控制台程序信息

原创 2007年10月06日 22:10:00
前几天问了朋友关于怎样捕捉控制台信息的问题,原来是用了管道技术,而且我这儿还有这方面的资料,只是我平时没注意罢了,真是....... 

下面就简单介绍一下管道,说白了就是进程或网络间通信,有两种管道,即有名管道和匿名管道。匿名管道就是没有名字的管道了,也就是说在使用它们时不需要知道其名字。而有名管道正好相反,在使用前必须知道其名字。

也可以根据管道的特性来分类,即是单向的还是双向的。单向管道,数据只能沿一个方向移动,从一端流向另一端,而双向管道数据可以在两端间自由交换。匿名管道通常是单向的而有名管道通常是双向的。有名管道常用于一个服务器联络多个客户端的网络环境。

网络的我不了解,先说说进程的罢,我这人表达能力不行,就举个例子吧,比如说我们现在要捕捉ping程序的输出信息用管道就很容易实现,我们首先在程序中创建一个管道(通过CreatePipe)这样我们就得到了一个管道的写端口和一个读端口,然后我们通过CreateProcess创建控制台子进程,其中要用到STARTUPINFO这个结构,这个结构中就有控制台的三个标准句柄,(输入,输出,错误)我们要做的就是把上面CreatePipe中得到的写端口送给这里的输出端口,这样控制台应用程序的输出就会被我们偷偷的捕捉了,而它不知道这一切,它还是以为它是向控制台做标准输出,是不是挺爽的.说了这么多的废话下面是一个捕获PING程序输出信息的小程序,大家将就着看看吧!别扔砖啊! 


#include "windows.h"
#include "resource.h"
HWND hInst;
LRESULT CALLBACK PING(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  DWORD hWrite,hRead;
  STARTUPINFO startupinfo;
  PROCESS_INFORMATION pinfo;
  SECURITY_ATTRIBUTES sat;
  TCHAR  szBuffer[1024],ipBuffer[20];
  int bytesRead;
  HWND  hwndEdit;
  switch (message)
  {
    case WM_INITDIALOG:
      
        SendMessage(hDlg,WM_SETICON,ICON_BIG,LoadIcon(hInst,ICO_PING));
        return TRUE;

    case WM_COMMAND:
      switch (LOWORD(wParam)) 
      {
      case IDC_EXIT:
        EndDialog(hDlg, LOWORD(wParam));
        break;
      case IDOK:
        RtlZeroMemory(ipBuffer,20);
        strcpy(ipBuffer,"ping ");
        GetDlgItemText(hDlg,IDC_IPADDRESS,ipBuffer+5,20);

        hwndEdit=GetDlgItem(hDlg,IDC_OUTINFOR);

        sat.nLength=sizeof(SECURITY_ATTRIBUTES);
        sat.bInheritHandle=TRUE;
        sat.lpSecurityDescriptor=NULL;
        
        if(CreatePipe(&hRead,&hWrite,&sat,0)==0)    //创建匿名管道
          MessageBox(hDlg,TEXT("创建管道失败"),TEXT("PING"),MB_OK);
        else
        {
          startupinfo.cb=sizeof(STARTUPINFO);
          GetStartupInfo(&startupinfo);
          startupinfo.hStdOutput=hWrite;      //用管道的写端代替控制台程序的输出端以便得到输出的信息
          startupinfo.hStdError=hWrite;
          startupinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES ;
          startupinfo.wShowWindow=SW_HIDE;        //隐藏控制台程序窗口
          if(CreateProcess(NULL, ipBuffer,NULL,NULL,TRUE,NULL,NULL,NULL,&startupinfo,&pinfo)==NULL)
            MessageBox(hDlg,TEXT("创建进程失败"),TEXT("PING"),MB_OK);
          else
          {
            CloseHandle(hWrite);        //关关闭写端,因为写端已经给了控制台程序,不能存在两个写端
            while(TRUE)
            {
                            RtlZeroMemory(szBuffer,1024); 
                            if(ReadFile(hRead,szBuffer,1023,&bytesRead,NULL)==NULL)  //注意ReadFile的第一个参数正是读端的句柄
                                break;
                            SendMessage(hwndEdit,EM_SETSEL,-1,0); 
                            SendMessage(hwndEdit,EM_REPLACESEL,FALSE,szBuffer);    //循环读入信息直到没有信息可读
                        }

          }
          CloseHandle(hWrite);
        }
        break;
      }
      return TRUE;
  }
    return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  hInst=hInstance;
   DialogBoxParam(hInstance,(LPCTSTR)DLG_MAIN,NULL,(DLGPROC)PING,NULL);
  return 0;
}
上传的附件
文件类型: rar ping.rar (2007-06-06 18:38, 50.7 KB, 59 次下载)
 

第100章、WebView应用之Javascript调用Android(从零开始学Android)

在某些Android应用中,使用Javascript调用Android中的方法也是会用到的。   (1)用WebView来显示HTML代码;   (2)允许WebView执行JavaScript ...
  • jianghuiquan
  • jianghuiquan
  • 2013年03月18日 14:37
  • 3487

C# 系统应用之鼠标模拟技术及自动操作鼠标

游戏程序的操作不外乎两种——键盘输入控制和鼠标输入控制,几乎所有游戏中都使用鼠标来改变角色的位置和方向,本文主要是讲述如何使用C#调用Windows API函数实现鼠标模拟操作的功能.首先通过结合Fi...
  • Eastmount
  • Eastmount
  • 2014年10月13日 20:04
  • 5779

Delphi 执行控制台(console)程序获取返回结果

[delphi] view plain copy  print? function GetRunConsoleResult(FileName:String;Visibili...
  • chinajobs
  • chinajobs
  • 2016年12月21日 10:53
  • 767

栈的应用——表达式求值

栈的应用——表达式求值  栈在数据结构中应用非常广泛,表达式求值就是最典型的例子之一。 1、        “表达式”  =  “第一操作数”  +  “运算符”  +  “第二操作数”   ...
  • K_zer0
  • K_zer0
  • 2017年02月07日 14:37
  • 239

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

Kaggle上的大神们,也分享过一些experience,说几条我记得的哈: 『对数据的认识太重要了!』 『数据中的特殊点/离群点的分析和处理太重要了!』 『特征工程(feature enginee...
  • longxinchen_ml
  • longxinchen_ml
  • 2015年11月12日 13:52
  • 10575

【转】C# 系统应用之使用Pancel控件同一窗体切换页面

时间 2014-03-18 15:57:49  CSDN博客原文  http://blog.csdn.net/eastmount/article/details/21461275 该文章...
  • zjwen2007
  • zjwen2007
  • 2014年11月12日 19:36
  • 365

重定向控制台程序的输入输出

重定向控制台程序的输入输出 利用了管道, 和 createprocess这个api #include #include #include using namespace std;...
  • guyue35
  • guyue35
  • 2015年08月01日 15:29
  • 1231

Java 异常的捕获与处理详解(一)

一、异常的产生异常是程序之中导致程序中断的一种指令流,异常一旦出现并且没有进行合理处理的话,那么程序就将中断执行。 下面,通过两个程序来进行异常产生问题的对比。 (1)不产生异常的程序:publi...
  • wei_zhi
  • wei_zhi
  • 2016年10月17日 10:45
  • 4803

Windows下用breakpad抓取C++程序崩溃报告

breakpad是一组用于实现崩溃报告系统的客户端和服务器组件,本文主要讲述在Window 10和Visual Studio 2015环境下,如何用breakpad抓取C++程序的崩溃报告。(本文也应...
  • BingZhongDeHuoYan
  • BingZhongDeHuoYan
  • 2016年12月24日 16:26
  • 875

【Java】控制异常在控制台输出

每次在Java程出现问题,总会抛出一大堆异常,让人眼花缭乱,在Javaweb编程的时候尤甚,让人很难找到出错的位置, 尤其在你网络工程文件多、插件多、框架的时候,各种插件、框架连锁,导致你更难找到出...
  • yongh701
  • yongh701
  • 2015年04月09日 10:32
  • 3778
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:管道应用之捕获控制台程序信息
举报原因:
原因补充:

(最多只允许输入30个字)