Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Eine *.cmd die startet, aber vorzeitig abbricht! (https://www.delphipraxis.net/170919-eine-%2A-cmd-die-startet-aber-vorzeitig-abbricht.html)

Bummi 10. Okt 2012 14:20

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...

http://www.delphipraxis.net/152490-w...tionieren.html

DeddyH 10. Okt 2012 14:39

AW: Eine *.cmd die startet, aber vorzeitig abbricht!
 
Müsste es
Delphi-Quellcode:
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);
nicht auch tun?

darkmarin 10. Okt 2012 15:09

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:
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;
Ich steh auf dem Schlauch.


Gruß

Darko

darkmarin 10. Okt 2012 15:10

AW: Eine *.cmd die startet, aber vorzeitig abbricht!
 
Hallo Detlef

probier ich sofort aus!:thumb:

darkmarin 10. Okt 2012 15:54

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.

DeddyH 10. Okt 2012 15:59

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?

darkmarin 10. Okt 2012 16:31

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 ...

DeddyH 10. Okt 2012 16:33

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.

darkmarin 10. Okt 2012 16:39

AW: Eine *.cmd die startet, aber vorzeitig abbricht!
 
Nein, gleicher Fehler.

Funktioniert nur wenn ich direkt in einer Konsole starte.

jaenicke 10. Okt 2012 16:40

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:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 Uhr.
Seite 2 von 3     12 3      

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