您现在的位置:首页 >> 基础算法 >> window基础 >> 内容

在Delphi中捕获控制台程序的输出

时间:2011/9/3 15:36:33 点击:

  核心提示:本文实现了在Delphi中运行控制台程序,并将控制台程序的输出在Memo控件中显示出来。   工作中需要手工编译J2ME的程序,开始编写了一个批处理程序,但是感觉使用中非常繁琐,于是想用Delphi做...
本文实现了在Delphi中运行控制台程序,并将控制台程序的输出在Memo控件中显示出来。

  工作中需要手工编译J2ME的程序,开始编写了一个批处理程序,但是感觉使用中非常繁琐,于是想用Delphi做一个集成编译工具,但是java的编译工具都是console程序,怎么捕获到console程序的输出,并显示在Memo中呢,查了网上的一些资料,反复测试,找到了一个实现的方法,希望对大家有帮助:

  procedure TMainForm.RunDosInMemo(const DosApp: string; AMemo: TMemo);
  const
    {设置ReadBuffer的大小}
    ReadBuffer = 2400;
  var
    Security: TSecurityAttributes;
    ReadPipe, WritePipe: THandle;
    start: TStartUpInfo;
    ProcessInfo: TProcessInformation;
    Buffer: PChar;
    BytesRead: DWord;
    Buf: string;
  begin
    with Security do
    begin
      nlength := SizeOf(TSecurityAttributes);
      binherithandle := true;
      lpsecuritydescriptor := nil;
    end;
    {创建一个命名管道用来捕获console程序的输出}
    if Createpipe(ReadPipe, WritePipe, @Security, 0) then
    begin
      Buffer := AllocMem(ReadBuffer + 1);
      FillChar(Start, Sizeof(Start), #0)
      {设置console程序的启动属性}
      with start do
      begin
        cb := SizeOf(start);
        start.lpReserved := nil;
        lpDesktop := nil;
        lpTitle := nil;
        dwX := 0;
        dwY := 0;
        dwXSize := 0;
        dwYSize := 0;
        dwXCountChars := 0;
        dwYCountChars := 0;
        dwFillAttribute := 0;
        cbReserved2 := 0;
        lpReserved2 := nil;
        hStdOutput := WritePipe; //将输出定向到我们建立的WritePipe上
        hStdInput := ReadPipe; //将输入定向到我们建立的ReadPipe上
        hStdError := WritePipe;//将错误输出定向到我们建立的WritePipe上
        dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        wShowWindow := SW_HIDE;//设置窗口为hide
      end;

      try
        {创建一个子进程,运行console程序}
        if CreateProcess(nil, PChar(DosApp), @Security, @Security, true,
          NORMAL_PRIORITY_CLASS,
          nil, nil, start, ProcessInfo) then
        begin
         {等待进程运行结束}
          WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
          {关闭输出...开始没有关掉它,结果如果没有输出的话,程序死掉了。}
          CloseHandle(WritePipe);
          Buf := '';
          {读取console程序的输出}
          repeat
            BytesRead := 0;
            ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
            Buffer[BytesRead] := #0;
            OemToAnsi(Buffer, Buffer);
            Buf := Buf + string(Buffer);
          until (BytesRead < ReadBuffer);

          SendDebug(Buf);
         {按照换行符进行分割,并在Memo中显示出来}
          while pos(#10, Buf) > 0 do
          begin
            AMemo.Lines.Add(Copy(Buf, 1, pos(#10, Buf) - 1));
            Delete(Buf, 1, pos(#10, Buf));
          end;
        end;
      finally
        FreeMem(Buffer);
        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread);
        CloseHandle(ReadPipe);
      end;
    end;
  end;

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号