Einzelnen Beitrag anzeigen

skyquaker

Registriert seit: 14. Sep 2006
96 Beiträge
 
Delphi 7 Professional
 
#1

Konsole in Memo anzeigen.

  Alt 24. Apr 2007, 15:53
Ich weißt nicht ob meine Frage hier richtig ist. Ich stell sie jetzt einfach mal.

In eine Memobox in meinem Programm soll ein Konsolenprogramm (z.B. die CMD) ausgegeben werden.
Das funktioniert auch sehr gut, mit diesem Snippet:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject) ;

  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_CLASS,
           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;

  begin {button 1 code}
    RunDosInMemo('cmd.exe',Memo1) ;
  end;
Jetzt möchte ich aber, dass diese Konsole im Hintergrund geöffnet bleibt und Befehle annimmt (entweder durch eine Textbox oder, noch besser, direkt aus der Memo). Der Inhalt soll aber nachwievor in meiner Memo ausgegeben werden.

Ist das möglich? (Ich nehms mal stark an) Wenn ja, wie?

Ich bin für alle Hilfe dankbar.

EDIT: Es würde auch schon reichen zu wissen wie man die Konsole offen hält. Dann könnte ich die Befehle ja als Keystrokes übergeben.
  Mit Zitat antworten Zitat