精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>Windows API函数>>以前问过:如何捕捉DOS输出流,这是答案

主题:以前问过:如何捕捉DOS输出流,这是答案
发信人: delfan( )
整理人: soaringbird(2002-01-31 12:32:35), 站内信件
大富翁的YB_unique大侠给我的答案如下:

一个例子运行 'chkdsk.exe c:\' 并且 显示其输出结果到 Memo 中!

procedure RunDosInMemo(DosApp:String;AMemo:TMemo);
 const
    ReadBuffer = 2400;
 var
  Security            : TSecurityAttributes;
  ReadPipe,WritePipe  : THandle;
  start               : TStartUpInfo;
  ProcessInfo         : TProcessInformation;
  Buffer              : Pchar;
  BytesRead           : DWord;
  Apprunning          : DWord;
 begin
  With Security do begin
   nlength              := SizeOf(TSecurityAttributes);
   binherithandle       := true;
   lpsecuritydescriptor := nil;
  end;
  if Createpipe (ReadPipe, WritePipe, @Security, 0) then begin
   Buffer  := AllocMem(ReadBuffer + 1);
   FillChar(Start,Sizeof(Start),#0);
   start.cb          := SizeOf(start);
   start.hStdOutput  := WritePipe;
   start.hStdInput   := ReadPipe;
   start.dwFlags     := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
   start.wShowWindow := SW_HIDE;
   if
CreateProcess(nil,PChar(DosApp),@Security,@Security,true,NORMAL_PRIORITY_C
LASS,
          nil,nil,start,ProcessInfo)
   then
   begin
    repeat
     Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
     Application.ProcessMessages;
    until (Apprunning <> WAIT_TIMEOUT);
     Repeat
       BytesRead := 0;
       ReadFile(ReadPipe,Buffer[0],ReadBuffer,BytesRead,nil);
       Buffer[BytesRead]:= #0;
       OemToAnsi(Buffer,Buffer);
       AMemo.Text := AMemo.text + String(Buffer);
     until (BytesRead < ReadBuffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;

调用实例:
RunDosInMemo('chkdsk.exe c:\',Memo1);



----
俺的小窝,关于Delphi,Java,XML等东东   

[关闭][返回]