![]() |
Dos-Programm öffnen
Ich will ein Dosprogramm mit Parametern öffnen. es ist schon etwas länger her, dass ich damit angefangen (habe noch mit anderen Projekten angefangen)
Naja aufjeden Fall liegt das Programm, was ich öffnen will, im Verzeichnis tools im Hauptprogrammverzeichnis, in dem auch meine Anwendung liegt. Das Problem ist folgendes, dass das Dos-Programm nicht das macht was es eigentlich soll, und auch tut wenn ich es normal starte (also ohne meine Anwendung)
Delphi-Quellcode:
hiermit rufe ich es auf
function OpenProgram(prog, params: string):Boolean;
var c, p: array[0..800] of Char; begin StrPCopy(c, prog); StrPCopy(p, params); ShellExecute(Application.Handle, 'open', c, p, nil, SW_NORMAL); end;
Delphi-Quellcode:
Die datei err.msg soll erstellt werden und aus der datei.html soll gelesen werden.
OpenProgram(ExtractFilePath(ParamSTr(0))+'tools/tidy', ' -f err.msg'+'- datei.html');
Das DOS-Fenster öffnet sich und schließt sofort wieder, die Datei err.msg wird aber nicht erstellt |
Also, ich würde die Parameter so ändern:
Delphi-Quellcode:
<hris (sieht doch auch nicht schlecht aus... ;) )
OpenProgram(ExtractFilePath(ParamSTr(0))+'tools/tidy.com', '-f err.msg'+' -datei.html');
|
daran liegt es nicht, man kann den relativen und den absoluten Pfad nutzen (dachte ich auch erst....)
Also er muss ja die *.exe finden, denn sonst würde er ja kein DOS-Fenster öffnen. Nur irgendwie stimmt da was nicht. Die gleichen Parameter so in ein Dos-Fenster eingegeben -> funktioniert, per Programm nicht. |
Verdammt ich weiß jetzt woran es lag.....
:oops: :oops: :oops: :oops: :oops: Hat schon immer alles funktioniert. Nur hat er die err.msg komischerweise nach c:\windows\ gespeichert. Das Verhalten war beim normalen Ausführen anders..... |
Schnell mal zum Thema, willst du den dos text auslesen, nicht nur ausführen, dass du siehst, das er erfolgreich ausgeführt wurde.
|
Könnte mir jemand helfen?
Und den obigen Quellcode etwas abändern? Also ich will das mein Programm irgendeine Nachricht ausgibt wenn sich das Programm wieder beendet hat. Wie mache ich das? |
|
Willst du eine Nachricht empfange vom Dos, oder nur eine bestätigung ob das programm beendet wurde, ich kann dir geben, das du das im tmemo stehen hast, was im dos steht.
Das ist eigendlich ganz einfach:
Delphi-Quellcode:
Um die prozedur auszuführen, benutzt du z.B.
procedure CaptureDos(command:String;Stringsp:TStrings);
const CaptureBufferSize = 2500; var SecAttrib : TSecurityAttributes; ReadPipe,writePipe : THandle; Startup : TStartUpInfo; ProcessInfo : TProcessInformation; CaptureBuffer : Pchar; BytesRead : DWord; WaitHandle : DWord; begin Stringsp.clear; Stringsp.add('Starte "'+command+'"'); With SecAttrib do begin nlength := SizeOf(TSecurityAttributes); binherithandle := true; lpsecuritydescriptor := nil; end; if Createpipe (ReadPipe, writePipe, @SecAttrib, 0) then begin CaptureBuffer := AllocMem(CaptureBufferSize + 1); FillChar(Startup,Sizeof(Startup),#0); Startup.cb := SizeOf(Startup); Startup.hStdOutput := writePipe; Startup.hStdInput := ReadPipe; Startup.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; Startup.wShowWindow := SW_SHOW; if CreateProcess(nil, PChar(command), @SecAttrib, @SecAttrib, true, NORMAL_PRIORITY_CLASS, nil, nil, Startup, ProcessInfo) then begin repeat WaitHandle := WaitForSingleObject( ProcessInfo.hProcess,100); Application.ProcessMessages; until (WaitHandle <> WAIT_TIMEOUT) or application.terminated; if not application.terminated then Repeat BytesRead := 0; ReadFile(ReadPipe,CaptureBuffer[0],CaptureBufferSize,BytesRead,nil); CaptureBuffer[BytesRead]:= #0; OemToAnsi(CaptureBuffer,CaptureBuffer); Stringsp.Text := Stringsp.Text+String(CaptureBuffer); until (BytesRead < CaptureBufferSize); end else Stringsp.add('Fehler!'); FreeMem(CaptureBuffer); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(ReadPipe); CloseHandle(writePipe); end else Stringsp.add('Konnte Dos Kommando nicht starten, Fehler: #'+ inttostr(getlasterror)); end; procedure CaptureDos('dir c:',Memo1->Lines); dann bekommste dein dos komando. :-) [keine garantie, habe ich aus c++ übersetzt...] Falls ein fehler auftreten sollte, bitte melden! |
Sieht richtig aus, aber Aufruf nicht mit CaptureDos('dir c:',Memo1->Lines) sondern mit CaptureDos('dir C:\',Memo1.Lines);
Chris |
die Funktion von MAtthias sollte mich weiterbringen. (Link von FuckRacism)
@Tillmann David: ICh wollte nur abwarten bis das Prog beendet ist. Deine Funktion könnte man ja auch relativ leicht umarbeiten, zu dem was ich brauch Also Danke an alle |
Zitat:
|
HAb doch noch ein Problem.
Und zwar wie benutze ich die Funktion. Programm ausführen ist ja klar und dann wie gebe ich z.b. eine Message aus: Programm wurde beendet? Ich beziehe mich jetzt auf den Link von oben |
Ganz einfach: Gar nicht, wenn du die obrige methode meiner meinung nimmst, bekommste nie eine exitanweisung, da dosprogramme immer so lange laufen, biss man sie geschlossen, hat, aber anscheinend willste meine methode ja nicht nehmen, mich auch egal...
|
Hoi, alexander
Bei der Funktion von Matthias kannst, so wie ich das sehe, einfach nach dem Aufruf weitermachen ... schau dir mal den code von JBG der dort folgt noch an. |
@FuckRacism
Im Code von JBG steht aber nichts vom abwarten (jedenfalls so wie ich das sehe) @Tillmann David Das war doch nicht böse gemeint. Sicher kann ich auch dein Code nehmen nur ist deiner Wesentlich länger und liefert mir zusätlich noch Sachen, die eigentlich nicht brauch. Dann müsste ich die gesamte Funktion ja noch abändern |
Moin Alexander,
in der Funktion von Mathias (Win32ExecAndWait, Link von Roman), wird mit WaitForSingleObject gewartet bis das aufgerufene Programm geschlossen wird. |
Hoi,
so wie ich das sehe kannst du einfach nach dem WinExec32AndWait mit deinem Code weitermachen, dieser wird dann erst ausgeführt wenn das mit WinExec32AndWait ausgeführte Programm wieder beendet ist! |
Moin Zusammen,
Zitat:
Es gibt Programme, namentlich betrifft dies meiner Erfahrung nach viele Setup.exe die mit Install Shield erstellt wurden, die nur als Starter für das eigentliche Setup dienen, und sich danach sofort beenden. Man darf sich also nicht wundern, wenn man so ein Setup über WinExec32AndWait startet, die Funktion zurückkehrt, und das Setup noch läuft. Um das zu umgehen müsste man noch das vorhanden sein des durch das Setup gestarteten Prozesses mit abfragen. Bei MSI Installationen sieht's ähnlich aus, mir fällt nur gerade nicht der Parameter ein, mit dem man auf das Ende warten kann. |
danke jetzt habe ich es kapiert. :P
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 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