![]() |
Delphi-Version: XE
Eine *.cmd die startet, aber vorzeitig abbricht!
Hallo an Alle :-D
ich bin seit einiger Zeit dabei und fühle mich sehr wohl hier in diesem Forum. Bis jetzt habe ich dieses lediglich nur als Nachschlagewerk genutzt, das ist meine erste Anfrage und es wäre sehr nett wenn ich Unterstützung bekommen könnte. Bis jetzt reichte immer die Suchfunktion aber jetzt... :?: wenn ich ein *.cmd direkt in einem Windows Fenster starte dann läuft das Aufgerufene Programm mit allen Parametern fehlerfrei ab. Starte ich aber aus dem Delphi Programm mit egal welcher version Shellexec... oder CreateProcess... schliesst der Vorgang ohne Fehler vorzeitig ab. Wie kannich ein solches Windows Fenster nachprogrammieren? Als ob es aus dem Windows heraus gestartet wurde. Ich hoffe ich konnte mein Problem ausreichend beschreiben. Grüße und vielen Dank im voraus Darko |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Du kannst die CMD.exe starten und ihr via Parameter sagen, daß sie diese CMD ausführen soll (siehe
Delphi-Quellcode:
)
CMD /?
Hast du denn auch das Arbeitsverzeichnis beim ShellExecute angegeben? Tipp: Mach einfach mal nach/vor jeder Zeile, in der CMD, eine PAUSE rein. |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Mit ShellExecute bzw. CreateProcess wird ja auch nur ein separater Prozess gestartet und der Aufruf kehrt sofort sofort zurück.
Wenn du in deinem Programm auf das Ende dieses Prozesses warten willst, dann musst du das auch tun. Das geht mit einer entsprechenden WaitFor-Anweisung, wobei du an das Process-Handle z.B. bei CreateProcess über den letzten Parameter lpProcessInformation herankommst. Allerdings ist deine Anwendung dann während des WaitFor blockiert. Man sollte dann entsprechende Vorkehrungen treffen, um das gegebenfalls abzubrechen. Bei Delphi About gibt es ein Beispiel: ![]() |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Hallo und vielen Dank für die schnelle Unterstützung!:thumb:
In der *.cmd ist folgender Inhalt c:\openocd-0.5.0\bin\openocd-0.5.0.exe -f c:\openocd-0.5.0\interface\jtagkey.cfg -f C:\openocd-0.5.0\WORK\jtag_ertec\ertec200.cfg -c "global SOURCE" -c "set SOURCE 4377FC_105.bin" -f c:/FknFile/4377FC_105.scr > c:\AmoLogFiles\Standard.log Ich bin auf die Ausgabe aus dem Script heraus angewiesen da dort jeweils der Fortschritt dokumentiert wird. Ich gebe (TCL Script) jeweils mit ECHO und PUTS in die Konsole und das Logfile aus. WaitForSingleObject(ProcessInfo.hProcess, INFINITE);// hab ich bedacht. Im Process Explorer ist es so das aus der Konsole die openocd.exe gekillt wird aus der SchellExecute aber die cmd.exe beendet wird obwohl openocd.exe noch läuft. Wie formuliere ich den Aufruf das die Konsole bleibt bis alle aus Ihr heraus gestarteten Processe beendet sind? Ich denke das ist mein Problem. Liebe Grüße Darko |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Und wenn Du cmd mit dem Parameter /K startest?
|
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Hallo Detlef
wie meinst du das? Jetzt mal nur ein Aufruf als Beispiel.
Delphi-Quellcode:
Die Funktion ist nicht von mir sondern lediglich die letzte von vielen die ich ausprobiert habe.
begin
if ExecAndWaitUAC('c:\openocd-0.5.0\bin\openocd-0.5.0.exe', ' -f c:\openocd-0.5.0\interface\jtagkey.cfg -f C:\openocd-0.5.0\WORK\jtag_ertec\ertec200.cfg -c "global SOURCE" -c "set SOURCE 4377FC_105.bin" -f c:/FknFile/4377FC_105.scr > c:\AmoLogFiles\Standard.log'); then
Delphi-Quellcode:
Gruß
function TspecConsole.ExecAndWaitUAC(Filename, Params: Widestring; WindowState: word = SW_SHOWNORMAL): boolean;
var ShExecInfoW: SHELLEXECUTEINFOW; ShExecInfoA: SHELLEXECUTEINFOA; r : Cardinal; begin Result := false; if Filename = '' then exit; if not FileExists(FileName) then exit; ZeroMemory(@ShExecInfoW, SizeOf(ShExecInfoW)); ShExecInfoW.Wnd := GetForegroundWindow; ShExecInfoW.cbSize := sizeof(SHELLEXECUTEINFOW); ShExecInfoW.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfoW.lpVerb := 'open'; ShExecInfoW.lpFile := PWideChar(Filename); ShExecInfoW.lpParameters := PWideChar(Params); ShExecInfoW.lpDirectory := PWideChar(ExtractFileDir(Filename)); ShExecInfoW.nShow := WindowState; Result := ShellExecuteExW(@ShExecInfoW); try if Result then begin r := WaitForSingleObject(ShExecInfoW.hProcess, INFINITE) end; finally //CloseHandle(ShExecInfoW.hProcess); end; end; Darko |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Starte nicht deine exe, sondern die cmd.exe und gib deinen Aufruf nach /k als weiteren Parameter an.
Oder du machst es noch einfacher und liest die Ausgabe des Aufrufs selbst aus und speicherst diese Ausgabe selbst aus Delphi heraus in die c:\AmoLogFiles\Standard.log. |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Hallo Sebastian
ich verstehe nicht was du meinst mit meiner exe. Ich starte openocd.exe übergebe dann => Programmerdaten jtagkey.cfg dann => Prozessordaten ertec200.cfg dann => Firmwaredaten als Global SOURCE" -c "set SOURCE xyz.bin" dann => das ArbeitsScript xyz.scr und sag ihm wohin mit den Mitteilungen aus dem Script > c:\AmoLogFiles\Standard.log' ich habe das Problem des zu frühen beenden des CreateProcess oder ShellExecute Processes. Im Hintergrund läuft noch openocd. Gruß und Danke Darko |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Eine Umleitung von Ausgaben/Eingaben funktioniert nur auf einer CMD, denn die stellt die nötige Umgebung zur Verfügung. Das bedeutet, dass deine openocd.exe nur dann erfolgreich mit einer Umleitung läuft, wenn du sie innerhalb einer CMD laufen lässt.
MfG Dalai |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Oder anders gesagt, das > ist ein "Operator", welcher von der CMD interpretiert wird.
Aber so wie du es jetzt aufrufst, wird dieses als (zwei) Parameter an deine EXE übergeben, welche dieses so wohl nicht von sich aus behandelt. Man kann es aber auch selber umleiten. Es gibt auch Komponenten, welche eine Pipe als Ausgabepfade angeben, wo man dann die Ausgaben direkt in einer Datei, einem Stream oder gar als Event geliefert bekommt. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 Uhr. |
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 by Thomas Breitkreuz