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 ?) |
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. |
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. |
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 * CreateToolHelp32Snapshot + Process32First/Process32Next * EnumProcesses 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). |
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? |
AW: fremdes Programm aufrufen
mit cmd.com starte das Programm ganz normal, es gibt keine weiteren
Ausgaben. In Eignschaften ist kein weiterer Eintrag |
AW: fremdes Programm aufrufen
Zitat:
|
AW: fremdes Programm aufrufen
Das Programm ist eine Exe
|
AW: fremdes Programm aufrufen
Zitat:
|
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:
ausgibt und den Wert von
ParamStr(0)
Delphi-Quellcode:
.
GetCurrentDir
Dann teste mit Explorer, CMD und deinem Programm. |
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. |
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 |
AW: fremdes Programm aufrufen
Zitat:
|
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) |
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. |
AW: fremdes Programm aufrufen
Zitat:
|
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? |
AW: fremdes Programm aufrufen
Mache Dir bitte eine Batchdatei für den Aufruf des externen Programmes:
Code:
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.
Programmaufruf, so wie per ShellExecute
pause 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. |
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. |
AW: fremdes Programm aufrufen
Dann solltest du die CMD mal das aktuelle Arbeitsverzeichnis ausgeben lassen:
Code:
und vielleicht generell auf das
echo %cd%
REM oder einfach nur cd
Code:
zu Beginn der Batch verzichten, sofern noch nicht passiert. Es muss ja einen Unterschied zwischen den beiden Startwegen geben.
@echo off
Grüße Dalai |
AW: fremdes Programm aufrufen
Befremdlich :-(
Bitte ergänze mal die Batchdatei:
Code:
Was wird beim Start der Batch von der Kommandozeile angezeigt, was beim Start über Shellexecute?
@cd
@echo %0 @path Programmaufruf, so wie per ShellExecute @echo %ERRORLEVEL% pause Gibt es irgendwelche Unterschiede? |
AW: fremdes Programm aufrufen
Ein
Delphi-Quellcode:
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)
cd /d "%~dp0"
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:
oft auch recht praktisch.
@if errorlevel 1 pause
|
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. |
AW: fremdes Programm aufrufen
Genau dafür ist der Directory-Parameter von ShellExecute da.
|
AW: fremdes Programm aufrufen
Zitat:
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