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 Wie löschen Consolenprogramme die Ausgabe in der CMD.exe ? (https://www.delphipraxis.net/31068-wie-loeschen-consolenprogramme-die-ausgabe-der-cmd-exe.html)

supermuckl 3. Okt 2004 20:35


Wie löschen Consolenprogramme die Ausgabe in der CMD.exe ?
 
hoi all..

ich versuch grad die cmd.exe mit pipes nachzubauen.. brauch ich für windows und für linux für eine bestimmte exe.
also ich muss auf die über pipes zugreifen können.. da bin ich noch dran aber es wird was..

jedenfalls würde mich interressieren wie eine consolenapplication den text in der console aktualisieren kann

also wie z.b. unter linux der befehl TOP .. da baut sich die ganze console immer neu auf ( also der text )

es scrollt nicht einfach nach oben weg sondern wird gelöscht und neu geschrieben

unter windows gibt es solche consolenproggis auch.. nun wie kann ich das in so einer consolenapplication selber machen?
bzw was für einen befehl ( warscheinlich über die pipe ) muss ich abfangen und daraufhin mein "memo feld" clearen ?

fkerber 3. Okt 2004 20:37

Re: Wie löschen Consolenprogramme die Ausgabe in der CMD.exe
 
Hi!

Der in der Konsole einzugegebende Befehl dafür lautet CLS.
Vielleicht hilft dir das.


Ciao Frederic

Union 3. Okt 2004 20:40

Re: Wie löschen Consolenprogramme die Ausgabe in der CMD.exe
 
Zitat:

Zitat von supermuckl
hoi all..

ich versuch grad die cmd.exe mit pipes nachzubauen.. brauch ich für windows und für linux für eine bestimmte exe.
also ich muss auf die über pipes zugreifen können.. da bin ich noch dran aber es wird was..

jedenfalls würde mich interressieren wie eine consolenapplication den text in der console aktualisieren kann

also wie z.b. unter linux der befehl TOP .. da baut sich die ganze console immer neu auf ( also der text )

es scrollt nicht einfach nach oben weg sondern wird gelöscht und neu geschrieben

unter windows gibt es solche consolenproggis auch.. nun wie kann ich das in so einer consolenapplication selber machen?
bzw was für einen befehl ( warscheinlich über die pipe ) muss ich abfangen und daraufhin mein "memo feld" clearen ?

Um die Console komplett steuern zu können, brauchst Du einen Terminaltreiber. Unix Systeme sind meist mit VT-52 oder VT-102 Emulationen ausgestattet. Under Windows/Dos gibt es dafür Ansi.Sys (Device=Ansi.sys in der Config.sys). Eine Übersicht über die Codes findest Du hier Ansi.Sys Escape codes oder hier Windows 98: MS-DOS Gerätetreiber - Teil 1

supermuckl 3. Okt 2004 20:40

Re: Wie löschen Consolenprogramme die Ausgabe in der CMD.exe
 
hey cool.. das ist es wohl :)

thx :)

AAH jetzt hab ich grad help eingegeben und seh da CLS !

naja.. das es so einfach ist hab ich jetzt net gedacht.. dachte das wäre umständlicher gelöst so wie alles *g*

hoffentlich tuts unter linux auch so.. würde meine deep purple DVD sammlung verwetten wenn das nicht so wäre :cheers:

fiasko 3. Okt 2004 21:12

Re: Wie löschen Consolenprogramme die Ausgabe in der CMD.exe
 
Hallo,

unter Linux ist entweder clear oder C-L üblich. ANSI-Codes versteht ein Linux-Terminal-Emulation von selbst - unter WIn mit cmd.exe keine Ahnung - zu DOS-Zeiten mußte man ja noch die ansi.sys laden...

[edit]
Ich frag mich grad wozu man ein löschen des Bildschirmes bei pipes brauch :gruebel:

Für eine Pipe muß ja kein Terminal laufen? :gruebel: :gruebel:
[/edit]

supermuckl 3. Okt 2004 21:56

Re: Wie löschen Consolenprogramme die Ausgabe in der CMD.exe
 
jep.. muss kein terminal laufen weil ich das terminal sein will und einen prozess starten will mit dem ich aber über pipes kommunizieren will.. und wenn der mir CLS sendet (über WriteLn oderso ) dann muss ich das ja entsprechend verarbeiten und die ausgaben z.b. refreshen weil ja neue daten da sind ( beispiel wäre unter linux das mainboard monitor proggi als consolen prog das die ganze zeit temps ausgibt über die pipe sache )

supermuckl 3. Okt 2004 22:01

Re: Wie löschen Consolenprogramme die Ausgabe in der CMD.exe
 
hab mir mal übrigends den quelltext von bdn wo es um so eine consolen pipe angelegenheit geht ( genau das was ich brauch )
von C++ nach Delphi übersetzt.. senden von befehlen fehlt halt aber das kann man sich ja selbst dazu denken wers braucht.. ich muss nur auslesen

der samplecode startet entweder die cmd exe und dann hat man sozusagen seine eigene console ( wenn man da jetzt noch input übersetzt )

oder halt gleich mit nem befehl cmd /c dir c:\winnt /s

so als beispiel..

die URL zum C++ quellcode vom BDN gibts hier: http://bdn.borland.com/article/0,1410,10387,00.html
und einen thread aus DP wo es um das gleiche ging, was blos net so 100%ig klappte ist hier zu haben: http://www.delphipraxis.net/internal...ct.php?t=24492

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure GetConsoleOutput(const Command: String);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
    function IsWinNT: boolean;
var
  Form1: TForm1;

implementation

{$R *.dfm}


function IsWinNT: boolean;
var
osv : OSVERSIONINFO;
begin
result := false;
try
osv.dwOSVersionInfoSize := sizeof(osv);
GetVersionEx(osv);
result := (osv.dwPlatformId = VER_PLATFORM_WIN32_NT);
except
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetConsoleOutput('cmd /c dir c:\winnt /s');
end;

procedure TForm1.GetConsoleOutput(const Command: String);

var
  si: TStartupInfo;
  pi: TProcessInformation;
  sa: TSecurityAttributes;
  sd: TSECURITYDESCRIPTOR;
  newstdin,newstdout,read_stdout,write_stdin:Thandle;
  Succeed: Boolean;
  Buffer: array [0..1024] of Char;
  NumberOfBytesRead: DWORD;
  BytesAvailable: DWORD;
  //Stream: TMemoryStream;
  app_spawn: string;
  exitcode : cardinal;
begin
  //Initialisierung ProcessInfo
  FillChar(pi, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(sa, SizeOf(TSecurityAttributes), 0);
  if IsWinNT then begin
    InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(@sd, true, nil, false);
    sa.lpSecurityDescriptor := @sd;
  end else begin
  sa.lpSecurityDescriptor := nil;
  end;
  sa.nLength := SizeOf(sa);
  sa.bInheritHandle := true;


  if (not CreatePipe(newstdin,write_stdin,@sa,0)) then begin
  CloseHandle(newstdin);
  CloseHandle(write_stdin);
  exit;   //create stdin pipe
  end;

  if (not CreatePipe(read_stdout,newstdout,@sa,0)) then begin //create stdout pipe
  CloseHandle(read_stdout);
  CloseHandle(newstdout);
    exit;
   end;

 

  GetStartupInfo(si);     //set startupinfo for the spawned process
  {
  The dwFlags member tells CreateProcess how to make the process.
  STARTF_USESTDHANDLES validates the hStd* members. STARTF_USESHOWWINDOW
  validates the wShowWindow member.
  }
   si.dwFlags := STARTF_USESTDHANDLES OR STARTF_USESHOWWINDOW;
  si.wShowWindow := SW_HIDE;
  si.hStdOutput := newstdout;
  si.hStdError := newstdout;    //set the new handles for the child process
  si.hStdInput := newstdin;
  app_spawn := 'c:\\window3\\system32\\cmd.exe';

    //spawn the child process
 // if (not CreateProcess(pchar(app_spawn),nil,nil,nil,TRUE,CREATE_NEW_CONSOLE,nil,nil,si,pi)) then begin
    if (not CreateProcess(nil, PChar(command), nil, nil, true,CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,si,pi)) then begin

    CloseHandle(newstdin);
    CloseHandle(newstdout);
    CloseHandle(read_stdout);
    CloseHandle(write_stdin);

  end else begin
   //fillchar(buffer,sizeof(buffer),0);

   // main loop
   exitcode := 0;
   while true do begin
     GetExitCodeProcess(pi.hProcess,exitcode);     //while the process is running
     if (exitcode <> STILL_ACTIVE) then break;
     BytesAvailable := 0;
     PeekNamedPipe(read_stdout,pchar(buffer[0]),1023,@NumberOfBytesRead,@BytesAvailable,nil);
     //check to see if there is any data to read from stdout
     if (NumberOfBytesRead <> 0) then begin

         if (BytesAvailable > 1023) then begin
           while (NumberOfBytesRead >= 1023) do begin
           fillchar(buffer,sizeof(buffer),0);

          ReadFile(read_stdout,buffer,1023,NumberOfBytesRead,nil); //read the stdout pipe

            memo1.Lines.Add(buffer);

           end;

         end else begin
         fillchar(buffer,sizeof(buffer),0);
           ReadFile(read_stdout,buffer,1023,NumberOfBytesRead,nil); //read the stdout pipe
           memo1.Lines.Add(buffer);
         end;
     end;


   end; // main loop
   CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(newstdin);           //clean stuff up
  CloseHandle(newstdout);
  CloseHandle(read_stdout);
  CloseHandle(write_stdin);

  end; // process created


end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 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