AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi 'cmd-Befehl' in Delphi ausführen mit Ausgabe

'cmd-Befehl' in Delphi ausführen mit Ausgabe

Ein Thema von skunnes · begonnen am 5. Aug 2012 · letzter Beitrag vom 27. Mai 2019
Antwort Antwort
skunnes

Registriert seit: 5. Aug 2012
2 Beiträge
 
#1

'cmd-Befehl' in Delphi ausführen mit Ausgabe

  Alt 5. Aug 2012, 23:27
Delphi-Version: XE2
Hallo zusammen,

da ich noch recht neu bin wollte ich mal hier nachfragen, ob mir jemand helfen kann.

Es geht um folgendes:

Ich möchte doe Ausgabe eines cmd-Befehl, wie beispielsweise netstat -t in einem Memo-Feld anzeigen lasen.
Bevor ich diesen Post / Thread hier verfasst habe war ich natürlich selbst auf der Suche. Ich bin auch teils fündig geworden.
Die simple Ausgabe eines cmd-Befehls ist mir durch Shellexecute gelungen.

Ich benötige also eine Art executeandwaitforfinish Funktion.

Diese habe ich (zumindest denke ich das) auch gefunden.

Undzwar hier: http://www.delphipraxis.net/119316-a...e-fassung.html
und hier: http://www.delphi-treff.de/tipps/sys...ramm-anzeigen/

Da ich natürlich nicht den Thread von stz aufwecken wollte habe ich mich nun dazu entschlossen diesen hier zu erstellen.

Ich habe nämlich beide Funktionen eingefügt. Beim ausführen bekomme ich bei beiden jedoch folgende Fehlermeldung: http://d.pr/i/cgH8

Ich wäre sehr dankbar für jeglich Hilfe.

Sollten noch Fragen offen stehen oder weitere Informationen benötigt werden kann ich diese gerne liefern!

Gruß,
skunnes
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#2

AW: 'cmd-Befehl' in Delphi ausführen mit Ausgabe

  Alt 6. Aug 2012, 00:00
Hi und willkommen im Forum.

Das liegt daran, dass neuere Delphi Versionen die Unicode Version von CreateProcess verwenden. In dieser Version ist der Parameter lpCommandLine veränderlich und nicht konstant. Siehe auch: http://embarcadero.newsgroups.archiv...104294937.html

Daher musst du folgenden Code verwenden:

Delphi-Quellcode:
function GetConsoleOutput(const Command : string;
                          Output, Errors : TStringList) : Boolean;
var
  Buffer : array[0..255] of Char;
  CreationFlags : DWORD;
  NumberOfBytesRead : DWORD;
  PipeErrorsRead : THandle;
  PipeErrorsWrite : THandle;
  PipeOutputRead : THandle;
  PipeOutputWrite : THandle;
  ProcessInfo : TProcessInformation;
  SecurityAttr : TSecurityAttributes;
  StartupInfo : TStartupInfo;
  Stream : TMemoryStream;
  sCmd : string;
begin
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(TSecurityAttributes);
  SecurityAttr.bInheritHandle := True;
  SecurityAttr.lpSecurityDescriptor := nil;

  //Pipes erzeugen
  CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
  CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);

  //Initialisierung StartupInfo
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.hStdInput := 0;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError := PipeErrorsWrite;
  StartupInfo.wShowWindow := SW_HIDE;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  CreationFlags := CREATE_DEFAULT_ERROR_MODE or
                   CREATE_NEW_CONSOLE or
                   NORMAL_PRIORITY_CLASS;
  sCmd:=Command;
  UniqueString(sCmd);
  if CreateProcess(nil,
                   (PChar(sCmd)),
                   nil,
                   nil,
                   True,
                   CreationFlags,
                   nil,
                   nil,
                   StartupInfo,
                   ProcessInfo) then
  begin
    Result := True;
    //Write-Pipes schließen
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsWrite);

    //Ausgabe Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil) do
      begin
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Output.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeOutputRead);

    //Fehler Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil) do
      begin
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Errors.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeErrorsRead);

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end
  else
  begin
    Result := False;
    CloseHandle(PipeOutputRead);
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsRead);
    CloseHandle(PipeErrorsWrite);
  end;
end;
Gruß, Michael
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.473 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: 'cmd-Befehl' in Delphi ausführen mit Ausgabe

  Alt 6. Aug 2012, 00:26
[ot]Danke! Und zwar für eines der seltenen Male, wo ein "Frischling" eine Frage so traumhaft formuliert und recherchiert hat, sowie für eine präzise und direkte Antwort. *tränewegwisch* Mein Glaube in die Menschheit ist heute Nacht ein sichtbares Stück gewachsen
Und: Mehr als willkommen in der DP, skunnes! [/ot]
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
skunnes

Registriert seit: 5. Aug 2012
2 Beiträge
 
#4

AW: 'cmd-Befehl' in Delphi ausführen mit Ausgabe

  Alt 6. Aug 2012, 00:59
Nabend und vielen Dank für die sehr schnelle Antwort und Lösung
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: 'cmd-Befehl' in Delphi ausführen mit Ausgabe

  Alt 6. Aug 2012, 01:06
ich möcht mich Medium unumwunden anschließen ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.164 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: 'cmd-Befehl' in Delphi ausführen mit Ausgabe

  Alt 6. Aug 2012, 06:04
Ich mich auch...

Hinweis: Bei Bildern von Fehlermeldungen ist es besser sie hier direkt anzuhängen statt extern zu lagern. In meinem Falle kann ich z.B. auf deines nicht zugreifen (Scripts geblockt etc.). Desweiteren bleiben die Bilder erhalten sollte der externe Hoster mal Pleite gehen
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.810 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: 'cmd-Befehl' in Delphi ausführen mit Ausgabe

  Alt 27. Mai 2019, 11:53
Hinweis: Bei Bildern von Fehlermeldungen ist es besser sie hier direkt anzuhängen statt extern zu lagern. In meinem Falle kann ich z.B. auf deines nicht zugreifen (Scripts geblockt etc.). Desweiteren bleiben die Bilder erhalten sollte der externe Hoster mal Pleite gehen
Oder, wie hier geschehen, durch eine andere Bilddatei ersetzt

Beim ausführen bekomme ich bei beiden jedoch folgende Fehlermeldung: http://d.pr/i/cgH8
Ich habe sowieso nie verstanden, was an einem Screenshot besser sein soll als an dem PLAIN TEXT der Fehlermeldung.
Den Inhalt einer Fehlermeldung bzw. MessageDlg(...) kann man ja mit [Strg]+[C] auch kopieren.

Das Klappt sogar mit Titelzeile und Buttons:
Code:
---------------------------
Project1
---------------------------
'X' ist kein gültiger Integerwert.
---------------------------
OK  
---------------------------
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
1.715 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: 'cmd-Befehl' in Delphi ausführen mit Ausgabe

  Alt 27. Mai 2019, 12:08
Danke, für den Hinweis, war mir auch nicht bekannt...

Das wird mir in der Tat in Zukunft Arbeit abnehmen...
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.810 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: 'cmd-Befehl' in Delphi ausführen mit Ausgabe

  Alt 27. Mai 2019, 12:15
Danke, für den Hinweis, war mir auch nicht bekannt...
Das wird mir in der Tat in Zukunft Arbeit abnehmen...


Das geht schon ewig. Ich glaube schon unter Win3.1

Und es geht nicht nur bei Delphi Anwendungen, sondern auch bei den Standard-Dialogen vieler anderen Anwendungen.
Ist eine Win32 API Funktionalität
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf