delphi 在MEMO中显示DOS窗口中执行的程序

一共有两种方法,第一种看下面的代码
//RunDosInMemo(‘ping 127.0.0.1’,Memo1);
 
procedure RunDosInMemo(Que:String;EnMemo:TMemo);
  const
     CUANTOBUFFER = 2000;
  var
    Seguridades         : TSecurityAttributes;
    PaLeer,PaEscribir   : THandle;
    start          : TStartUpInfo;
    ProcessInfo         : TProcessInformation;
    Buffer          : Pchar;
    BytesRead          : DWord;
    CuandoSale          : DWord;
  begin
    with Seguridades do
    begin
      nlength          := SizeOf(TSecurityAttributes);
      binherithandle       := true;
      lpsecuritydescriptor := nil;
    end;
    {Creamos el pipe…}
    if Createpipe (PaLeer, PaEscribir, @Seguridades, 0) then
    begin
      Buffer  := AllocMem(CUANTOBUFFER + 1);
      FillChar(Start,Sizeof(Start),#0);
      start.cb          := SizeOf(start);
      start.hStdOutput  := PaEscribir;
      start.hStdInput   := PaLeer;
      start.dwFlags     := STARTF_USESTDHANDLES +
          STARTF_USESHOWWINDOW;
      start.wShowWindow := SW_HIDE;

      if CreateProcess(nil,
         PChar(Que),
         @Seguridades,
         @Seguridades,
         true,
         NORMAL_PRIORITY_CLASS,
         nil,
         nil,
         start,
         ProcessInfo)
      then
        begin
          {Espera a que termine la ejecucion}
          repeat
          CuandoSale := WaitForSingleObject( ProcessInfo.hProcess,100);
          Application.ProcessMessages;
          until (CuandoSale <> WAIT_TIMEOUT);
          {Leemos la Pipe}
          repeat
          BytesRead := 0;
          {Llenamos un troncho de la pipe, igual a nuestro buffer}
          ReadFile(PaLeer,Buffer[0],CUANTOBUFFER,BytesRead,nil);
          {La convertimos en una string terminada en cero}
          Buffer[BytesRead]:= #0;
          {Convertimos caracteres DOS a ANSI}
          OemToAnsi(Buffer,Buffer);
          EnMemo.Text := EnMemo.text + String(Buffer);
          until (BytesRead < CUANTOBUFFER);
        end;
      FreeMem(Buffer);
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
      CloseHandle(PaLeer);
      CloseHandle(PaEscribir);
    end;
  end;

第二种请下载附件  catchdosoutput_v101



发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 5 = 9