AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Eine *.cmd die startet, aber vorzeitig abbricht!
Thema durchsuchen
Ansicht
Themen-Optionen

Eine *.cmd die startet, aber vorzeitig abbricht!

Ein Thema von darkmarin · begonnen am 10. Okt 2012 · letzter Beitrag vom 16. Okt 2012
Antwort Antwort
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#1

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

  Alt 10. Okt 2012, 13:14
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 10. Okt 2012, 13:20
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:
ich habe das Problem des zu frühen beenden des CreateProcess oder ShellExecute Processes.
Das ist aber kein Problem dieser Befehle, denn diese starten nunmal nur und warten nicht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

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

  Alt 10. Okt 2012, 13:20
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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 10. Okt 2012, 13:39
Müsste es 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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
darkmarin

Registriert seit: 26. Sep 2011
23 Beiträge
 
Delphi XE3 Professional
 
#5

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

  Alt 10. Okt 2012, 14:09
Hallo hab da ganze mal mit memos aufgebaut.

Ok mit der Ausgabe über Pipes klappt,
Aber wie den Aufruf übergeben das die Abhängigkeiten stimmen?

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
  Mit Zitat antworten Zitat
darkmarin

Registriert seit: 26. Sep 2011
23 Beiträge
 
Delphi XE3 Professional
 
#6

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

  Alt 10. Okt 2012, 14:10
Hallo Detlef

probier ich sofort aus!
  Mit Zitat antworten Zitat
darkmarin

Registriert seit: 26. Sep 2011
23 Beiträge
 
Delphi XE3 Professional
 
#7

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

  Alt 10. Okt 2012, 14:54
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 10. Okt 2012, 14:59
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
darkmarin

Registriert seit: 26. Sep 2011
23 Beiträge
 
Delphi XE3 Professional
 
#9

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

  Alt 10. Okt 2012, 15:31
Ich habe den Pfad mit angegeben macht aber keinen Unterschied.
Der Fehler bleibt.

couldn't open 43.bin ...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 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-2025 by Thomas Breitkreuz