Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Konsole in Memo anzeigen. (https://www.delphipraxis.net/90834-konsole-memo-anzeigen.html)

skyquaker 24. Apr 2007 15:53


Konsole in Memo anzeigen.
 
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.

netphoenix86 24. Apr 2007 16:55

Re: Konsole in Memo anzeigen.
 
Ich glaub das ging auch mit der Komponente "TDOSMemo": TDosMemo
Kannst dir ja mal angucken :shock:

skyquaker 24. Apr 2007 20:15

Re: Konsole in Memo anzeigen.
 
Ich habs mir nur kurz angeschaut, ich meine aber, dass es im Grunde das Selbe ist, was ich oben auch habe und somit keine Lösung meines Problems.

CCRDude 24. Apr 2007 20:28

Re: Konsole in Memo anzeigen.
 
Wahrscheinlich eher DosCommand... läuft in nem extra Thread. Dadurch läuft es schonmal im Hintergrund, ob man dem auch noch ohne weitere Manipulation Eingaben zu späterer Zeit verpassen kann, weiss ich leider nicht. Aber weder Dein Beispiel in einen Thread auslagern noch dort etwas in die Input-Pipe zu schreiben dürfte allzu schwer zu ergänzen sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz