Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Konsole nachproggen - kleine Schwierigkeiten (https://www.delphipraxis.net/26752-konsole-nachproggen-kleine-schwierigkeiten.html)

Skiron 28. Jul 2004 18:50


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:
ShellExecute(Handle,'open','cmd','/c '+Kommando,nil,SW_HIDE);
Das Ergebnis speichere ich mir dann in eine File ('>File' anhängen).
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?

ripper8472 28. Jul 2004 20:56

Re: Konsole nachproggen - kleine Schwierigkeiten
 
Such mal nach "Pipe" oder "Pipeline". Damit hast du nicht das Problem, in Dateien zwischenzuspeichern.

JasonDX 1. Sep 2004 09:22

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?

JasonDX 2. Sep 2004 11:08

Re: Konsole nachproggen - kleine Schwierigkeiten
 
[push]
Kann mir da niemand helfen?
[/push]

JasonDX 4. Sep 2004 00:06

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]

Nightshade 4. Sep 2004 03:50

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;

JasonDX 4. Sep 2004 12:24

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?

Duffy 4. Sep 2004 13:01

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

JasonDX 4. Sep 2004 14:16

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:

Syntax: ping [-t] [-a] [-n Anzahl] [-l Größe] [-f] [-i Gültigkeitsdauer]
[-v Diensttyp] [-r Anzahl] [-s Anzahl] [[-j Hostliste] |
[-k Hostliste]] [-w Zeitlimit] Zielname
Optionen:
-t Sendet fortlaufend Ping-Signale zum angegebenen Host.
.....
und wenn ich z.B. einen NSLookup starten will, krieg ich jede menge "unrecognized command" und das prog hängt sich auf.
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?

Duffy 4. Sep 2004 14:52

Re: Konsole nachproggen - kleine Schwierigkeiten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Chimaira,
Zitat:

Zitat von Chimaira
Syntax: ping [-t] [-a] [-n Anzahl] [-l Größe] [-f] [-i Gültigkeitsdauer]
[-v Diensttyp] [-r Anzahl] [-s Anzahl] [[-j Hostliste] |
[-k Hostliste]] [-w Zeitlimit] Zielname
Optionen:
-t Sendet fortlaufend Ping-Signale zum angegebenen Host.
.....

  • Die Demo sollte Dir helfen
  • Wenn die Konsole läuft, mußt Du ein bißchen basteln. Dann wird sich eine Lösung für Dein FTP Problem sicherlich finden.

bye
Claus

[EDIT]Demo getauscht ...[/EDIT]

Nightshade 4. Sep 2004 14:56

Re: Konsole nachproggen - kleine Schwierigkeiten
 
Gib den kompletten Befehl in "Command" an und las Params leer

Delphi-Quellcode:
CaptureDosCmd('ping localhost','',Memo1.lines);
Und das er wartet, bis der Prozess zu ende ist liegt an diesem teil :

Delphi-Quellcode:
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
Das "WaitForSingleObject" wartet bis der Prozess beendet ist.
Du musst diesen Teil irdenwie umschreiben und regelmässig die Readpipe leeren
(vielleicht über nen Timer ??)

JasonDX 4. Sep 2004 15:32

Re: Konsole nachproggen - kleine Schwierigkeiten
 
ich habs jetzt mal zum laufen gebracht...
THX!!!
Mal schaun was ich mit dem ftp machn lässt...

Nightshade 4. Sep 2004 15:56

Re: Konsole nachproggen - kleine Schwierigkeiten
 
Dann erzähl doch mal wie, für all die Leute die das gleiche Problem haben (Haben werden) :)

JasonDX 4. Sep 2004 16:00

Re: Konsole nachproggen - kleine Schwierigkeiten
 
eigentlich hat sich das ganze mit dem Demo von Duffy erledigt. Das Problem lag bei den Parametern...

Duffy 4. Sep 2004 21:17

Re: Konsole nachproggen - kleine Schwierigkeiten
 
Hallo Chimaira,

Zitat:

Zitat von Chimaira
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?

bezüglich deines FTP Problems, hier mal ein Lösungsansatz mit dem Microsoft FTP-Client..

Der FTP wird mit

Code:
C:\WINDOWS\system32\ftp.exe –s:"Laufwerk:\Pfad\FTPCommands.dat"
gestartet.

Die Parameterdatei "FTPCommands.dat" hat dann folgenden Inhalt

Code:
open FTPSERVER
User
Password
Account <-- falls nötig
get <-- put, del etc.
Remote_FileName
Local_FileName
bye
so könnte es gehen …

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