ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在Delphi中捕获控制台程序的输出 (转)

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

原创 Linux操作系统 作者:worldblog 时间:2007-12-13 13:19:27 0 删除 编辑
在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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    6241
  • 访问量
    2411234