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

在Delphi中捕获控制台程序的输出 (转)[@more@]

本文实现了在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;


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-992876/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-992876/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值