![]() |
Konsole nachproggen - kleine Schwierigkeiten
Ich will mir eine eigene Konsole basteln. Da es aber wenig Sinn macht, alle DOS-Befehle nochmal zu implementieren (Wozu das Rad neu erfinden?), nehm ich die Konsole dafür her:
Delphi-Quellcode:
Das Ergebnis speichere ich mir dann in eine File ('>File' anhängen).
ShellExecute(Handle,'open','cmd','/c '+Kommando,nil,SW_HIDE);
Dabei hab ich aber immernoch einige kleine Probleme: 1. Wenn ich z.B. in Unterordner gehe, müsst ich die Befehle abfangen, überprüfen, in welchen unterordner er geht ect. damit ich das auch dann richtig hinschreibe. Hoffentlich wärs da einfacher, die Konsole danach zu fragen 2. Wenn ich einen Befehl ausführe, beendet sich die Konsole wieder. Wie kann ich das verhindern /bzw. wie kann ich dafür sorgen, dass ich immer eine Konsole (versteckt) offen habe und die Befehle immer der sende? |
Re: Konsole nachproggen - kleine Schwierigkeiten
Such mal nach "Pipe" oder "Pipeline". Damit hast du nicht das Problem, in Dateien zwischenzuspeichern.
|
Re: Konsole nachproggen - kleine Schwierigkeiten
Ich hab mir jetzt auch mal vorgenommen, sowas zu proggen, dh, über Delphi eine Konsole anzusteuern, und hab auch ähnliche probleme.
Ich hab mich schon mal vor einiger Zeit kurz mit Pipes auseinandergesetzt, aber da hab ichs immer nur geschafft, zwischen 2 selbstgeschriebenen Progs zu kommunizieren. Ich hab leider keine Ahnung, wie ich eine Pipe zu einer Konsole legen kann... Die google und dp-suche über Pipes hat mir auch nicht so richtig geholfen. Kann mir jemand erklären, wie ich eine Pipe zu einem fremden Prog legen kann? |
Re: Konsole nachproggen - kleine Schwierigkeiten
[push]
Kann mir da niemand helfen? [/push] |
Re: Konsole nachproggen - kleine Schwierigkeiten
[push]
fragen wir mal so: ist das überhaupt möglich? Wenn ich eine Pipe leg, muss mir das prog doch antworten, oder? Gibts da noch 'ne andere möglichkeit, vielleicht den Inhalt der Konsole auszulesen? [/push] |
Re: Konsole nachproggen - kleine Schwierigkeiten
Ich hab da hier im Forum irgendwo mal diese Function gefunden,
vielleicht hilft dir das weiter :
Delphi-Quellcode:
procedure TEditForm.CaptureDosCmd(command, Params:String; var OutputMemo:TStringList);
const CaptureBufferSize = 4096; var SecAttrib : TSecurityAttributes; ReadPipe,writePipe : THandle; Startup : TStartUpInfo; ProcessInfo : TProcessInformation; CaptureBuffer : Pchar; BytesRead : DWord; WaitHandle : DWord; CurSize : Cardinal; procedure GetBuffer; begin Repeat BytesRead := 0; ReadFile(ReadPipe,CaptureBuffer[0],CaptureBufferSize,BytesRead,nil); CaptureBuffer[BytesRead]:= #0; OemToAnsi(CaptureBuffer,CaptureBuffer); OutputMemo.Text := OutputMemo.Text+String(CaptureBuffer); until (BytesRead < CaptureBufferSize); end; begin OutPutMemo.clear; // OutputMemo.add('# Starte "'+command+'"'); With SecAttrib do begin nlength := SizeOf(TSecurityAttributes); binherithandle := true; lpsecuritydescriptor := nil; end; if Createpipe (ReadPipe, writePipe, @SecAttrib, 0) then begin CaptureBuffer := AllocMem(CaptureBufferSize + 1); FillChar(Startup,Sizeof(Startup),#0); Startup.cb := SizeOf(Startup); Startup.hStdOutput := writePipe; Startup.hStdInput := ReadPipe; Startup.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; Startup.wShowWindow := SW_HIDE; // Startup.wShowWindow := SW_NORMAL; if CreateProcess(PChar(command), PChar(params), @SecAttrib, @SecAttrib, true, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, Startup, ProcessInfo) then begin repeat WaitHandle := WaitForSingleObject( ProcessInfo.hProcess,0); CurSize := FileSeek(ReadPipe,0,2); If (CurSize >= 4096) then // Puffer in Memo ausgeben und damit leeren GetBuffer; Application.ProcessMessages; until (WaitHandle = WAIT_OBJECT_0) or (WaitHandle = WAIT_FAILED) or application.terminated; if not application.terminated then begin CurSize := FileSeek(ReadPipe,0,2); If (CurSize > 0 ) then // Falls Rest im Puffer, in Memo ausgeben GetBuffer; end else OutPutMemo.add('# Operation canceled!'); FreeMem(CaptureBuffer); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(ReadPipe); CloseHandle(writePipe); end else OutPutMemo.add('# cannot create process. Error: #'+inttostr(getlasterror)); end else OutPutMemo.add('# cannot create pipe. Error: #'+inttostr(getlasterror)); end; |
Re: Konsole nachproggen - kleine Schwierigkeiten
hmm, der Code funzt bei mir nicht so richtig. Er kann den Prozess nicht erstellen. wenn ich als cmd 'ping', als params 'localhost' und eine Stringlist mitgebe kommt immer in der Stringlist, dass er den Prozess nicht erstellen kann! (errorcode 2)
Muss ich da irgendwas anders machen? |
Re: Konsole nachproggen - kleine Schwierigkeiten
Hallo Chimaira,
ja, Du mußt den vollständigen Pfad zu "ping.exe" angeben. Also z.B unter XP 'C:\Windows\System32\ping.exe'. das war es auch dann schon ... bye Claus |
Re: Konsole nachproggen - kleine Schwierigkeiten
aha, dann siehts schon 'n bissl besser aus, aber:
wenn ich dann den Ping ausführ krieg ich bloß die hilfe: Zitat:
und noch 'ne frage: ich hab den Beitrag gefunden, woher der Code kommt. Da steht geschrieben, das das alles erst gesendet wird, nachdem der befehl ausgeführt wurde. Problem: In meiner Konsole möcht ich auch ftp verwenden können. geht aber nicht, nachdem das ein eigenes prog is und somit erst fertig sein muss, bevor ich irgendwas krieg. Könnts da noch 'ne andere möglichkeit geben? |
Re: Konsole nachproggen - kleine Schwierigkeiten
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Chimaira,
Zitat:
bye Claus [EDIT]Demo getauscht ...[/EDIT] |
Re: Konsole nachproggen - kleine Schwierigkeiten
Gib den kompletten Befehl in "Command" an und las Params leer
Delphi-Quellcode:
Und das er wartet, bis der Prozess zu ende ist liegt an diesem teil :
CaptureDosCmd('ping localhost','',Memo1.lines);
Delphi-Quellcode:
Das "WaitForSingleObject" wartet bis der Prozess beendet ist.
repeat
WaitHandle := WaitForSingleObject( ProcessInfo.hProcess,0); CurSize := FileSeek(ReadPipe,0,2); If (CurSize >= 4096) then // Puffer in Memo ausgeben und damit leeren GetBuffer; Application.ProcessMessages; until (WaitHandle = WAIT_OBJECT_0) or (WaitHandle = WAIT_FAILED) or application.terminated; if not application.terminated then begin CurSize := FileSeek(ReadPipe,0,2); If (CurSize > 0 ) then // Falls Rest im Puffer, in Memo ausgeben GetBuffer; end else OutPutMemo.add('# Operation canceled!'); FreeMem(CaptureBuffer); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(ReadPipe); CloseHandle(writePipe); end Du musst diesen Teil irdenwie umschreiben und regelmässig die Readpipe leeren (vielleicht über nen Timer ??) |
Re: Konsole nachproggen - kleine Schwierigkeiten
ich habs jetzt mal zum laufen gebracht...
THX!!! Mal schaun was ich mit dem ftp machn lässt... |
Re: Konsole nachproggen - kleine Schwierigkeiten
Dann erzähl doch mal wie, für all die Leute die das gleiche Problem haben (Haben werden) :)
|
Re: Konsole nachproggen - kleine Schwierigkeiten
eigentlich hat sich das ganze mit dem Demo von Duffy erledigt. Das Problem lag bei den Parametern...
|
Re: Konsole nachproggen - kleine Schwierigkeiten
Hallo Chimaira,
Zitat:
Der FTP wird mit
Code:
gestartet.
C:\WINDOWS\system32\ftp.exe –s:"Laufwerk:\Pfad\FTPCommands.dat"
Die Parameterdatei "FTPCommands.dat" hat dann folgenden Inhalt
Code:
so könnte es gehen …
open FTPSERVER
User Password Account <-- falls nötig get <-- put, del etc. Remote_FileName Local_FileName bye bye Claus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 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