Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Shellexecute Ergebnis im Memo Objekt ausgeben (https://www.delphipraxis.net/210225-shellexecute-ergebnis-im-memo-objekt-ausgeben.html)

JimmyB 21. Mär 2022 11:53

Shellexecute Ergebnis im Memo Objekt ausgeben
 
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

Der schöne Günther 21. Mär 2022 12:04

AW: Shellexecute Ergebnis im Memo Objekt ausgeben
 
Hallo und Herzlich Willkommen :love:

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
Delphi-Quellcode:
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.

JimmyB 21. Mär 2022 13:09

AW: Shellexecute Ergebnis im Memo Objekt ausgeben
 
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

relocate 21. Mär 2022 13:22

AW: Shellexecute Ergebnis im Memo Objekt ausgeben
 
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

Maekkelrajter 21. Mär 2022 14:18

AW: Shellexecute Ergebnis im Memo Objekt ausgeben
 
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

hoika 21. Mär 2022 23:03

AW: Shellexecute Ergebnis im Memo Objekt ausgeben
 
Hallo,
eine Suche nach
ShellExecuteEx und Pipes sollten Dir helfen .

JimmyB 1. Apr 2022 12:55

AW: Shellexecute Ergebnis im Memo Objekt ausgeben
 
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

peterbelow 1. Apr 2022 16:00

AW: Shellexecute Ergebnis im Memo Objekt ausgeben
 
Zitat:

Zitat von JimmyB (Beitrag 1504181)
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.

JimmyB 2. Apr 2022 10:14

AW: Shellexecute Ergebnis im Memo Objekt ausgeben
 
Hallo,
das mit weiteren Thread schaue ich mir an.
Besten Dank für den Tip!
Viele Grüße
JimmmyB

TurboMagic 2. Apr 2022 13:50

AW: Shellexecute Ergebnis im Memo Objekt ausgeben
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr.
Seite 1 von 2  1 2      

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