Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   fremdes Programm aufrufen (https://www.delphipraxis.net/208403-fremdes-programm-aufrufen.html)

joacim 25. Jul 2021 08:47

fremdes Programm aufrufen
 
Hallo,
mit der Quelle aus
https://www.delphipraxis.net/31067-s...cute-wait.html
kann man gut fremde Programme aus dem eigenen Programm heraus aufrufen.
Das habe ich schon erfolgreich gemacht Jetzt habe ich ein Fremdprogramm, bei dem das nicht klappt. Es gibt nur wenige Informationen zu diesem Fremdprogramm.

- mit einem Doppelklick kann es problemlos gestartet werden
- es ist wohl in Fortran geschrieben und eine 64 Bit Anwendung

Im Taskmanager kann ich nicht sehen, dass das Programm geöffnet wird, ev. geht es einfach zu schnell. Im Aufruf wir ja auf Beendigung des Fremdprogramms gewartet, da geht es sofort nach dem Start weiter. Wie schon gesagt, mit einem kleinen (eigenen) Testprogramm klappt alles. Ich habe den Eindruck, das es da „zwei Stufen“ gibt, und die erste Stufe sofort beendet wird. (Aufruf cmd.com ?)

himitsu 25. Jul 2021 08:57

AW: fremdes Programm aufrufen
 
Starten (explorrer)
Starten und warten (du)
das ist ein Unterschied (das Starten geht ja dennoch)

Scripte usw., welche durch ein anderes Programm interpretiert werden,
da startest du nicht "diese" Datei, sondern ein anderes Programm, welche sie öffnet.
(BAT, PS1, JAVA, BAS, PAS, TXT, DOC, .......)
Hier kann man selbst direkt das andere Programm starten und ihm die Datei als Parameter geben,
anstatt es automatisch machen zu lassen.

Und es gibt Programme, die nutzen einen Loader.
z.B. BDSLauncher.exe vs. BDS.exe im Delphi, oder bei MS-Office usw.

Da wird der Launcher absichtlich wieder beendet, bevor das Ganze fertig ist.
und dein Warten wartet nur auf die erste gestartete EXE (den Launcher), aber von der Anderen weiß sie nichts.
-> man könnte über die ToolsAPI nach anderen Prozessen suchen, welche diesen Prozess als Parent haben und auch auf deren Ende warten.

joacim 25. Jul 2021 09:19

AW: fremdes Programm aufrufen
 
@himitsu
schönen Sonntag! und danke.
Sowas in der Art habe ich mir schon gedacht.
Ich glaube in D6 geht das mit ToolsAPI noch nicht.

Und bitte nicht über die alte Version meckern, ich pflege immer noch
ein damit erstelltes Programm, dass alle Windows Umstellungen seit
WIN95 klaglos überstanden h.

himitsu 25. Jul 2021 09:26

AW: fremdes Programm aufrufen
 
Nicht die OpenToolsAPI (OTA) von Delphi, womit man in die Delphi-IDE rein kommt,
sondern die von Windows, um in Windows reinzukommen. :wink:

https://docs.microsoft.com/en-us/win...ss-enumeration

* MSDN-Library durchsuchenCreateToolHelp32Snapshot + MSDN-Library durchsuchenProcess32First/Process32Next
* MSDN-Library durchsuchenEnumProcesses hilft nicht viel, wenn man damit nicht an Parent oder Childs kommt


32 ist OK, denn es geht um die Win32-APIs und die sind in 32 und 64 Bit das Gleiche (bzw. auch in 64 Bit heißt sie Win32 ... ist wie die APIs von WinRT oder .NET).

zeras 25. Jul 2021 09:35

AW: fremdes Programm aufrufen
 
Wie sieht denn der Aufruf beim Doppelklick aus? Welche Datei soll gestartet werden?
Was passiert, wenn du das Programm mit der Konsole (cmd.com) startest? Kommen da vielleicht Meldungen?
Bei einem Icon gibt es auch noch die Zeile "Ausführen in". Ist da vielleicht etwas eingetragen?

joacim 25. Jul 2021 09:52

AW: fremdes Programm aufrufen
 
mit cmd.com starte das Programm ganz normal, es gibt keine weiteren
Ausgaben. In Eignschaften ist kein weiterer Eintrag

zeras 25. Jul 2021 10:07

AW: fremdes Programm aufrufen
 
Zitat:

Zitat von joacim (Beitrag 1492766)
mit cmd.com starte das Programm ganz normal, es gibt keine weiteren
Ausgaben.

Ist das eine Exe oder hat das Programm eine andere Dateiendung?

joacim 25. Jul 2021 10:44

AW: fremdes Programm aufrufen
 
Das Programm ist eine Exe

blawen 25. Jul 2021 10:52

AW: fremdes Programm aufrufen
 
Zitat:

Zitat von himitsu (Beitrag 1492762)
Starten (explorrer)
Starten und warten (du)
das ist ein Unterschied (das Starten geht ja dennoch)

Und wenn Du das Programm via dem ersten Weg (Shellexecute) startest?

Sinspin 25. Jul 2021 12:31

AW: fremdes Programm aufrufen
 
Ich denke das liegt am Verzeichnis in dem ausgeführt wird.

Schreib mal zum Test ein Programm das dir beim Start den Wert aus
Delphi-Quellcode:
ParamStr(0)
ausgibt und den Wert von
Delphi-Quellcode:
GetCurrentDir
.
Dann teste mit Explorer, CMD und deinem Programm.

joacim 25. Jul 2021 12:40

AW: fremdes Programm aufrufen
 
@sinspin
Das aufzufende Programm liegt in einem Verzeichnis "unter" dem Verzeichnis meines Programms. Dort habe ich auch ein minimals Testprogramm abgelegt, dass ich problemlos (nach entsprechender Änderung des Aufrufstrings) starten kann.

Dalai 25. Jul 2021 14:03

AW: fremdes Programm aufrufen
 
Meine Empfehlung: Rückgaben von ShellExecute(Ex) auswerten und/oder mit Process Monitor überwachen, was genau passiert und mit welchen Ergebnissen. Das ist besser als Rumraten.

Grüße
Dalai

Sinspin 25. Jul 2021 15:30

AW: fremdes Programm aufrufen
 
Zitat:

Zitat von joacim (Beitrag 1492777)
@sinspin
Das aufzufende Programm liegt in einem Verzeichnis "unter" dem Verzeichnis meines Programms. Dort habe ich auch ein minimals Testprogramm abgelegt, dass ich problemlos (nach entsprechender Änderung des Aufrufstrings) starten kann.

Das glaube ich dir gerne. Trotzdem sind die beiden strings interessant wenn einmal von Explorer und einmal von deinen Programm aus aufgerufen.

himitsu 25. Jul 2021 18:07

AW: fremdes Programm aufrufen
 
Joar, Rückgaben sollte muß man eh immer auswerten
und natürlich immer schön mit vollständigen/absoluten Pfaden arbeiten.

z.B. die Open-/SaveDialoge ändern standardmmäßig das Arbeitsverzeichnis (und wer weiß wer sonst noch ... bzw. kann auch dein Programm bereit mit einem abweichendem Arbeitsverzichnis gestartet worden sein)

hoika 26. Jul 2021 06:09

AW: fremdes Programm aufrufen
 
Hallo,
erzeuge eine Bat-Datei mit dem Inhalt:
Start Dein-Programm

und rufe mal dies Bat-Datei in Deinem Programm auf.

shebang 26. Jul 2021 10:15

AW: fremdes Programm aufrufen
 
Zitat:

Zitat von Dalai (Beitrag 1492782)
mit Process Monitor überwachen

Den Vorschlag von Dalai kann ich nur unterstützen. Lass den Process Monitor mal mitlaufen und schau dir an, was die Exe genau macht.

joacim 28. Jul 2021 07:07

AW: fremdes Programm aufrufen
 
Ich habe jetzt alles in ein winziges Testprojekt gepackt und verwende
statt ShellExecuteEx jetzt ShellExecute, wg. Rückgabewert. Wie schon berichtet, kann ich ein eigenes Testprogramm erfolgreich per ShellExecute starten und bekomme als
Rückgabewert 42, d.h. über 32 also erfolgreicher Start. Beim eigentlich zu starteten
Programm bekomme ich als Rückgabewert auch 42, aber das Programmfenster wird nicht
(ev. nur sehr sehr kurz) angezeigt. Zusätzlich habe ich auch den MS Processmonitor mitlaufen lassen, falls das hilf, kann ich gerne Screenshots o.ä. posten.
Ganz am Ende der Liste sehe ich : Thread Exit, Process Exit. Das interpretiere ich als einen sofortigen Abbruch des zu startenden Programms. Fragt sich nur: warum?

Delphi.Narium 28. Jul 2021 10:28

AW: fremdes Programm aufrufen
 
Mache Dir bitte eine Batchdatei für den Aufruf des externen Programmes:
Code:
Programmaufruf, so wie per ShellExecute
pause
Diese Batchdatei rufst Du nun per Shellexecute auf, Pause sorgt dafür, dass das Fenster der Konsole offen bleibt. Damit kannst Du dann alle Fehlerausgaben des aufzufrufenden Programmes bzw. der Konsole sehen.

Per Tastendruck schließt sich das Fenster dann.

Wenn Du dann alle eventuell auftretenden Fehler behoben hast, kannst Du den Programmaufruf so, wie er in der Batchdatei erfolgreich ausgeführt wurde, per ShellExecute aus Deinem Programm heraus machen, ohne das Zwischenschalten der Batchdatei.

joacim 28. Jul 2021 13:20

AW: fremdes Programm aufrufen
 
Habe einen batchfile erstellt. Doppelklick auf den batchfile
startet wie gewünscht das fremde Programm cmd.exe bleibt stehen
und wartet auf einen Tastendruck, es gibt keine Fehlermeldungen.

Beim Aufruf des Batchfiles per shellexecute erscheint cmd.exe
und wartet auf einen Tastendruck, keine Fehlermeldungen aber auch kein
Fremdprogramm.

Dalai 28. Jul 2021 13:31

AW: fremdes Programm aufrufen
 
Dann solltest du die CMD mal das aktuelle Arbeitsverzeichnis ausgeben lassen:
Code:
echo %cd%
REM oder einfach nur
cd
und vielleicht generell auf das
Code:
@echo off
zu Beginn der Batch verzichten, sofern noch nicht passiert. Es muss ja einen Unterschied zwischen den beiden Startwegen geben.

Grüße
Dalai

Delphi.Narium 28. Jul 2021 13:34

AW: fremdes Programm aufrufen
 
Befremdlich :-(

Bitte ergänze mal die Batchdatei:
Code:
@cd
@echo %0
@path
Programmaufruf, so wie per ShellExecute
@echo %ERRORLEVEL%
pause
Was wird beim Start der Batch von der Kommandozeile angezeigt, was beim Start über Shellexecute?
Gibt es irgendwelche Unterschiede?

himitsu 28. Jul 2021 14:00

AW: fremdes Programm aufrufen
 
Ein
Delphi-Quellcode:
cd /d "%~dp0"
zu Beginn im Script setzt das Arbeitsverzeichnis auf das Verzeichnis der Batch. (muß man dann nur noch bissl aufpassen, wenn eine Batch von einer Anderen aufgerufen wird)

z.B. bei "Ausführen als Admin" wird beim Start über den Explorer C:\Windows\System32 verwendet. (normals nimmt der Explorer das aktuell geöffnete Verzeichnis oder bei Links das, was darin abweichend angegeben wurde)



Viele Programme geben als ExitCode 0 aus, wenn alles OK war, und 1 oder mehr, bei einem Fehler.
Daher ist nach Programmaufrufen in einer Batch ein
Delphi-Quellcode:
@if errorlevel 1  pause
oft auch recht praktisch.

joacim 29. Jul 2021 07:41

AW: fremdes Programm aufrufen
 
Lösung ist gefunden :-D, nochmals vielen Dank für die vielen Tips.
Letzlich war es erforderlich vor dem Aufruf des Programms mit
chDir() in sein Arbeitsverzeichnis zu wechseln.

DeddyH 29. Jul 2021 08:10

AW: fremdes Programm aufrufen
 
Genau dafür ist der Directory-Parameter von ShellExecute da.

Sinspin 29. Jul 2021 08:11

AW: fremdes Programm aufrufen
 
Zitat:

Zitat von joacim (Beitrag 1492940)
Letzlich war es erforderlich vor dem Aufruf des Programms mit chDir() in sein Arbeitsverzeichnis zu wechseln.

Das ist malwieder der HAMMER.
Es wurde Dir die ganze Zeit gesagt dass vermutlich das Verzeichnis falsch ist, unter anderem auch von mir. (gleich am Tag deiner Fragestellung)
Du hast also 4 Tage damit verschwendet diese Information zu ignorieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 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