![]() |
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] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:34 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