发信人: 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等东东    | 
 
 
 |