![]() |
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 ? |
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 |
Re: Wie löschen Consolenprogramme die Ausgabe in der CMD.exe
Zitat:
![]() ![]() |
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: |
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] |
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 )
|
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: ![]() und einen thread aus DP wo es um das gleiche ging, was blos net so 100%ig klappte ist hier zu haben: ![]()
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 14:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz