Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm extern ausführen (https://www.delphipraxis.net/83839-programm-extern-ausfuehren.html)

lbccaleb 7. Jan 2007 18:38

Re: Programm extern ausführen
 
ja ich wusste ja bisher nicht genau was du vorhast, jetzt wo du den screener gepostet hast kann ich dir schon mal sagen das "model" in dieser art dadrinne schon mal blödsinn ist, denn das prog erkennt diesen parameter so nicht, versuchs einfach mal ohne also so:


Delphi-Quellcode:
"scip.exe xy.mod"
dann kannst ja noch mal schreiben..

Ari 7. Jan 2007 18:44

Re: Programm extern ausführen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Funktioniert leider auch nicht. Habe außerdem leider auch die Befehle von AMPL und SCIP durchnander gebracht :oops: Kann die ja zum Glück leicht ändern..im Anhang jetzt der Versuch mit
scip.exe "read prog.zpl"

Also mit diesen Eingaben funktionierts leider nicht. Gebe ich aber zuerst scip.exe ein, lande ich im "SCIP>" und dann funktioniert "read prog.zpl"...

Ohne das "read" bzw. "model"/wie auch immer wird auch wieder angezeigt "invalid parameter <prog.zpl>"

Harry M. 7. Jan 2007 18:49

Re: Programm extern ausführen
 
Ist klar weil das programm nur die angegeben Parameter unterstützt, Die wären etwa -c -b -l
weder "read" noch "model" wird das Programm nie erkennen.

Ari 7. Jan 2007 19:38

Re: Programm extern ausführen
 
Oh mist :angel2:

Mit
Delphi-Quellcode:
WinExecAndWait_32('scip.exe -c "read sudoku.zpl opt disp sol"', 1, False);
funktionierts jetzt...

Vielen Dank an euch beide!! Hab mich ja selten doof angestellt xD

Jetzt bleibt nur noch aus, wie ich die Zeilen, die das Programm ausgibt (die Lösungen) in Delphi einlese..soll ich dazu einen extra Thread erstellen?
Könntet ihr mir da bitte auch noch helfen?

Harry M. 7. Jan 2007 20:42

Re: Programm extern ausführen
 
TDosCommand, CaptureCmd

Ari 8. Jan 2007 00:16

Re: Programm extern ausführen
 
Hab jetzt versucht, TDoscommand.pas zu installieren, da wird aber dann angezeigt
"Could not create '(mein Verzeichnispfad von Delphi)\projects\bpl\dclusr70.bpl'"
Wobei meine bpl Dateien glaub ich alle in (Delphi-Pfad)\Bin liegen..
Daraufhin hab ich ein neues Package erstellt und absolutes Chaos angerichtet..
Hab immerhin gute zwei Stunden gebraucht, um den angerichteten Schaden wieder zu reparieren bzw. herauszufinden wie ich auch wieder Dateien kompilieren kann :?

Kann mir jemand bitte helfen? Ich krieg das nicht auf die Reihe :-/

Harry M. 8. Jan 2007 04:58

Re: Programm extern ausführen
 
Morgen

Ich glaub Du hast Dein Delphi leicht verbogen. Versuch mal reparieren von Setup.

Delphi-Quellcode:
function GetConsoleOutput(const Command: String; var Output, Errors: TStringList): Boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecurityAttr: TSecurityAttributes;
  PipeOutputRead: THandle;
  PipeOutputWrite: THandle;
  PipeErrorsRead: THandle;
  PipeErrorsWrite: THandle;
  Succeed: Boolean;
  Buffer: array [0..255] of Char;
  NumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  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(StartupInfo);
  StartupInfo.hStdInput := 0;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError := PipeErrorsWrite;
  StartupInfo.wShowWindow := sw_Hide;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  if CreateProcess(nil, PChar(command), nil, nil, true,
  CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, 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 true do begin
        succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        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 true do begin
        succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        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;


procedure TForm1.Button1Click(Sender: TObject);
var
  output, errors: TStringList;
begin
   output:=TStringList.Create;
   try
   errors:=TStringList.Create;
   if GetConsoleOutput('cmd /K '+Edit1.Text, output, errors) then
   Memo1.Lines.AddStrings(output);
   finally
   output.free;
   errors.free;
   end;

end;
Edit1.Text -> Ist Dein Command! 'Cmd /k' musst du lassen. das sich die Console sonst nicht wiederbeendet. Schau in die Hilfe wegen dem Command (Cmd /?)

Ari 8. Jan 2007 18:34

Re: Programm extern ausführen
 
Danke für die Antwort!!

Mittlerweile scheint Delphi wieder zu funktionieren, hab einfach mal reparieren lassen und meine "environment" paths zurückgesetzt, immerhin hab ich jetzt keinen fehler mit "can't find system.pas" mehr.

Delphi startet das Programm ohne Fehlermeldungen. Führe ich aber den Prozess aus (klicke also auf den Button), läuft das Programm - spuckt aber nichts aus und stürzt ab (habs auch mal mehrere Minuten laufen lassen, hat nichts gebracht). Ist es außerdem möglich, statt in ein Memo-Feld eine Zeile bzw. einen Teil einer Zeile in ein Label einzulesen?
An dem Programm kann es eigentlich auch nicht liegen, hab ein paar Befehle gekürzt, damit das SCIP-Fenster nicht zu viele Zeilen hat, bewirkte aber auch nichts. Woran kann das jetzt liegen?

edit: hab die anderen Ausführ-Befehle wie WinExecute und so gelöscht und Edit1.Text durch 'scip.exe "r prog.zpl opt disp sol"', also meine Befehle ersetzt - richtig? Hab auch WinExecute nochmal vorher ausführen lassen aber dasselbe Ergebnis.

lbccaleb 8. Jan 2007 19:32

Re: Programm extern ausführen
 
du könntest so eine zeile aus einem memo in ein label einlesen:
Delphi-Quellcode:
label1.Caption := memo1.Lines.Strings[4];
wobei die 4 die zeile im memo ist, die du auslesen möchtest...

Ari 8. Jan 2007 23:17

Re: Programm extern ausführen
 
Oh man...mein Fehler war, dass ich für SCIP nicht den Befehl "quit" eingegeben habe -.-

Hmm jetzt verbleibt zuletzt (dann hör ich auch auf zu nerven ;) ), dass ich nur einen Teil der Zeile einlese, da meine Zeilen so aussehen:
x#1#1#5
und ich will nur die 5 einlesen lassen und in das label bringen. Geht das?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr.
Seite 3 von 4     123 4      

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