![]() |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Wenn Du bei CreateProcess mit Pipes versorgst, müsste der Aufruf funktionieren und die Ausgabe über die Pipe direkt abrufbar sein ...
StartupInfo.hStdOutput := PipeOutputWrite; StartupInfo.hStdError := PipeErrorsWrite; In dem Code hier sind die IMHO benötigten Info's... ![]() |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Müsste es
Delphi-Quellcode:
nicht auch tun?
ShellExecute(0, 'open', 'cmd.exe', PChar('/K 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'), nil, nil, SW_SHOW);
|
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Hallo hab da ganze mal mit memos aufgebaut.:idea:
Ok mit der Ausgabe über Pipes klappt, Aber wie den Aufruf übergeben das die Abhängigkeiten stimmen?:arrow::?::(
Delphi-Quellcode:
function TForm1.GetConsoleOutput(const Command : string;
Output, Errors : TStringList) : Boolean; var Buffer : array[0..1024] of Char; CreationFlags : DWORD; NumberOfBytesRead : DWORD; PipeErrorsRead : THandle; PipeErrorsWrite : THandle; PipeOutputRead : THandle; PipeOutputWrite : THandle; ProcessInfo : TProcessInformation; SecurityAttr : TSecurityAttributes; StartupInfo : TStartupInfo; Stream : TMemoryStream; begin //Initialisierung ProcessInfo FillChar(ProcessInfo, SizeOf(TProcessInformation), 0); //Initialisierung SecurityAttr FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0); SecurityAttr.nLength := SizeOf(TSecurityAttributes); SecurityAttr.bInheritHandle := True; SecurityAttr.lpSecurityDescriptor := nil; //Pipes erzeugen CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0); CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0); //Initialisierung StartupInfo FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb := SizeOf(TStartupInfo); StartupInfo.hStdInput := 0; StartupInfo.hStdOutput := PipeOutputWrite; StartupInfo.hStdError := PipeErrorsWrite; StartupInfo.wShowWindow := SW_HIDE; StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; CreationFlags := CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS; if CreateProcess(nil, PChar(Command), nil, nil, True, CreationFlags, nil, nil, StartupInfo, ProcessInfo) then begin Result := True; //Write-Pipes schließen CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsWrite); //Ausgabe Read-Pipe auslesen Stream := TMemoryStream.Create; try while ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil) do begin Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; Output.LoadFromStream(Stream); finally Stream.Free; end; CloseHandle(PipeOutputRead); //Fehler Read-Pipe auslesen Stream := TMemoryStream.Create; try while ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil) do begin Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; Errors.LoadFromStream(Stream); finally Stream.Free; end; CloseHandle(PipeErrorsRead); WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); end else begin Result := False; CloseHandle(PipeOutputRead); CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsRead); CloseHandle(PipeErrorsWrite); end; end;
Delphi-Quellcode:
Ich steh auf dem Schlauch.
procedure TForm1.Button3Click(Sender: TObject);
var Output : TStringList; Errors : TStringList; begin Output := TStringList.Create; Errors := TStringList.Create; try if GetConsoleOutput(AdvEdit1.Text, Output, Errors) then Memo1.Lines.AddStrings(Output); Memo2.Lines.AddStrings(Errors); finally Output.free; Errors.free; end; end; Gruß Darko |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Hallo Detlef
probier ich sofort aus!:thumb: |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Hallo Detlef
das Fenster bleibt stehen aber das Programm bricht an der gleichen Stelle, wie in den vorherigen Versuchen, vorzeitig ab. Teilauszug... aus der Konsole ************************************************** *************************** Error: couldn't open 4377FC_105.bin Runtime Error: c:/FknFile/4377FC_105.scr:298: in procedure 'script' at file "embedded:startup.tcl", line 58 in procedure 'flash' called at file "c:/FknFile/4377FC_105.scr", line 298 ************************************************** *************************** Das scheint das Problem zu sein wenn ich es über ShellEx... oder CreatePro... ablaufen lasse. |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Das sieht so aus, als ob ein Bildschirmschoner auf eine Datei zugreifen will, die es nicht gibt oder die momentan gesperrt ist oder oder. Kannst Du im SET SOURCE-Aufruf einen absoluten Pfad angeben?
|
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Ich habe den Pfad mit angegeben macht aber keinen Unterschied.
Der Fehler bleibt. couldn't open 43.bin ... |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Funktioniert es denn, wenn Du den ursprünglichen Befehl (also alles nach dem "/K") über Start-Ausführen absetzt? Es scheint ja irgend ein Problem beim Öffnen dieser bin zu geben.
|
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Nein, gleicher Fehler.
Funktioniert nur wenn ich direkt in einer Konsole starte. |
AW: Eine *.cmd die startet, aber vorzeitig abbricht!
Naja, in dem geposteten Quelltext wird als Arbeitsverzeichnis "nichts" angegeben (nil). Wenn du auf der Konsole startest, ist das dann das Verzeichnis, in dem du da bist.
Ich vermute mal das musst du noch setzen... Siehe Doku von CreateProcess: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 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