AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Wie löschen Consolenprogramme die Ausgabe in der CMD.exe ?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von supermuckl · begonnen am 3. Okt 2004 · letzter Beitrag vom 3. Okt 2004
Antwort Antwort
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#1

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

  Alt 3. Okt 2004, 21:35
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 ?
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#2

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

  Alt 3. Okt 2004, 21:37
Hi!

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


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 3. Okt 2004, 21:40
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
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#4

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

  Alt 3. Okt 2004, 21:40
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
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#5

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

  Alt 3. Okt 2004, 22:12
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

Für eine Pipe muß ja kein Terminal laufen?
[/edit]
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#6

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

  Alt 3. Okt 2004, 22:56
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 )
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#7

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

  Alt 3. Okt 2004, 23:01
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.
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:19 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