AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Shellexecute Ergebnis im Memo Objekt ausgeben
Thema durchsuchen
Ansicht
Themen-Optionen

Shellexecute Ergebnis im Memo Objekt ausgeben

Ein Thema von JimmyB · begonnen am 21. Mär 2022 · letzter Beitrag vom 16. Apr 2022
Antwort Antwort
Seite 1 von 2  1 2      
JimmyB

Registriert seit: 20. Mär 2022
26 Beiträge
 
#1

Shellexecute Ergebnis im Memo Objekt ausgeben

  Alt 21. Mär 2022, 11:53
Hallo,
ich bin seit ein paar Wochen neu mit Delphi unterwegs, dachte eigentlich dass was ich machen möchte ist einfach, bekomme es aber nicht auf die Reihe.

Ich möchte mit Shellexecute ein externes Kommandozeilen Programm ausführen.
Das Ergebnis soll in einem Memo Objekt ausgegeben werden.

Als einfaches Beispiel:

Filename := 'dir'; //"dir" dient hier nur als Beispielprogramm
ShellExecute(handle,'open',PChar(filename), '','',SW_SHOW);

Was müsste ich machen um die Ausgabe von "dir" in einem Memo Objekt darzustellen?

Viele Grüße
JimmyB
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Shellexecute Ergebnis im Memo Objekt ausgeben

  Alt 21. Mär 2022, 12:04
Hallo und Herzlich Willkommen

Das ist wirklich viel schwieriger als es klingt.
Wir müssen erst einmal klären was du genau willst. Mit "Ergebnis" meinst du wahrscheinlich nicht den "Rückgabecodes" eines Prozesses, sondern das, was das Programm in die Windows-Konsole schreibt, würde man es doppelklicken oder per Konsole aufrufen. Richtig?

Wenn ja, dann ist ShellExecute(..) bereits das falsche Werkzeug für die Mission. Es ist praktisch dazu gedacht, ein "Benutzer vor dem PC doppelklickt Element XY" zu simulieren. Es bietet keine Möglichkeiten, die "Standardausgabe stdOut" des Programms (welches du starten willst) so "abzufangen", dass du es z.B. in einer Memo anzeigen könntest.

Die richtigen Tools hierfür wären in der Regel das etwas unhandliche CreateProcess(..) und ein vorheriges Erstellen einer "Pipe", um die Standard-Ausgabe deines Konsolenprozesses "aufzufangen".

Im Internet gibt es viele fertige Lösungen, wenn du z.B. "delphi capture console output" in die Suchmaschine deines Vertrauens eingibst. Wenn man den Anspruch hat das wirklich zu verstehen ist schon einiges an Arbeit nötig, vor allem wenn man sich mit Dingen wie Pipes oder stdIn/stdOut noch nicht beschäftigt hat.
  Mit Zitat antworten Zitat
JimmyB

Registriert seit: 20. Mär 2022
26 Beiträge
 
#3

AW: Shellexecute Ergebnis im Memo Objekt ausgeben

  Alt 21. Mär 2022, 13:09
Hallo,

lieben Dank mit den richtigen Weg zu zeigen. Du hast es richtig wiedergeben, dass ich Rückgabecodes in ein Memo Objekt ausgeben möchte.
Ich mache mich auf die Suche nach Beispielen.

Viele Dank
JimmyB
  Mit Zitat antworten Zitat
relocate

Registriert seit: 26. Mai 2009
60 Beiträge
 
#4

AW: Shellexecute Ergebnis im Memo Objekt ausgeben

  Alt 21. Mär 2022, 13:22
Ich habe vor Äonen das hier benutzt, ob das heute noch geht weiß ich nicht (keine neue Delphi Version).

https://www.delphipraxis.net/80089-%...riable-ip.html
  Mit Zitat antworten Zitat
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
118 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Shellexecute Ergebnis im Memo Objekt ausgeben

  Alt 21. Mär 2022, 14:18
Hier findest du die Routine 'GetConsoleOutput' mit einer kleinen, aber wichtigen Ergänzung: Vor dem 'CreateProcess' muss die muss die Zeile 'UniqueString(Command);' eingefügt werden. Damit läuft sie bei mir unter Delphi 10.4 / Windows 10

Gruß LP
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Shellexecute Ergebnis im Memo Objekt ausgeben

  Alt 21. Mär 2022, 23:03
Hallo,
eine Suche nach
ShellExecuteEx und Pipes sollten Dir helfen .
Heiko
  Mit Zitat antworten Zitat
JimmyB

Registriert seit: 20. Mär 2022
26 Beiträge
 
#7

AW: Shellexecute Ergebnis im Memo Objekt ausgeben

  Alt 1. Apr 2022, 12:55
Hallo in die Runde,

und ganz lieben Dank für die vielen Hinweise und Tipps.

Ich habe es mit mit ShellExecute und Pipes geschafft. Ein externe Programm wird gestartet und das Ergebnis in einem Memo Fenster ausgegeben.
Soweit so gut.

Das aktuelle Problem ist, dass solange das externe Programm läuft, die eigentlich Delphi Anwendung eingefroren ist. Es ist nicht abgestürzt, sondern lässt sich erst dann wieder nutzen, wenn das externe Programm die Arbeit beendet hat.

Ich könnte mir fast vorstellen, dass diese "Einfriere" normal ist. Vielleicht auch nicht und man kann es irgendwie abstellen.

Viele Grüße
JimmyB
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Shellexecute Ergebnis im Memo Objekt ausgeben

  Alt 1. Apr 2022, 16:00
Hallo in die Runde,

und ganz lieben Dank für die vielen Hinweise und Tipps.

Ich habe es mit mit ShellExecute und Pipes geschafft. Ein externe Programm wird gestartet und das Ergebnis in einem Memo Fenster ausgegeben.
Soweit so gut.

Das aktuelle Problem ist, dass solange das externe Programm läuft, die eigentlich Delphi Anwendung eingefroren ist. Es ist nicht abgestürzt, sondern lässt sich erst dann wieder nutzen, wenn das externe Programm die Arbeit beendet hat.

Ich könnte mir fast vorstellen, dass diese "Einfriere" normal ist. Vielleicht auch nicht und man kann es irgendwie abstellen.

Viele Grüße
JimmyB
Wenn Du aus einer Pipe liest ist das blocking, das sollte man besser in einem sekundären Thread machen.
Peter Below
  Mit Zitat antworten Zitat
JimmyB

Registriert seit: 20. Mär 2022
26 Beiträge
 
#9

AW: Shellexecute Ergebnis im Memo Objekt ausgeben

  Alt 2. Apr 2022, 10:14
Hallo,
das mit weiteren Thread schaue ich mir an.
Besten Dank für den Tip!
Viele Grüße
JimmmyB
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.824 Beiträge
 
Delphi 12 Athens
 
#10

AW: Shellexecute Ergebnis im Memo Objekt ausgeben

  Alt 2. Apr 2022, 13:50
Wenn dein Delphi neu genug ist, gibt's für's Lesen von Console Ausgaben
(hab's aber ehrlicherweise selber noch nicht probiert) eine Bibliothek
im GetIt package manager (Tools/GetIt).

Ansonsten:
- Ja, wenn es blockiert, dann sollte es in einenThread oder einen Task
(-> Parallel Programming Library, seit XE7)
- eine Alternative ist: dir > Dateiname.txt, das würde die Ausgabe in eine
Datei umleiten, die könnte man dann auslesen. Datei Lesen wäre aber auch
blockierend...

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:43 Uhr.
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