Delphi-PRAXiS
Seite 1 von 2  1 2      

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]


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:11 Uhr.
Seite 1 von 2  1 2      

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