![]() |
Programm starten und auf Programmende warten
Hallöchen,
ich habe mal wieder ein Problem ;-) Ich würde gerne ein Programm starten, z.B. den Taschenrechner von Windows, und dann, wenn der Taschenrechner wieder geschlossen wurde, mit meinem Programm eine ShowMessage() ausgeben. Das Programm wird mit ShellExecute gestartet (ist klar), aber wie bekomme ich heraus, ob das Programm noch aktiv ist. Mit der Window-Caption kann man leider nicht arbeiten, weil man das in meinem Programm nicht hardcoden kann/darf. Für Links im Forum hier bin ich auch dankbar, aber ich hab keinen Ansatz dafür, was ich machen kann oder womit ich arbeiten könnte. Von dieser Thenmatik verstehe ich noch recht wenig :-/ Danke wie immer für eure Hilfe :-) Liebe Grüße Aike |
Re: Programm starten und auf Programmende warten
shellexecuteandwait
[edit] shellexecuteandwait hab ich mal gelesen, das gibt es bei mir nicht. Fürs erste kannst du mal das machen:
Delphi-Quellcode:
[/edit]
shellexecute(form1.Handle,'open',pansichar('calc.exe'),nil,nil,0);
|
Re: Programm starten und auf Programmende warten
|
Re: Programm starten und auf Programmende warten
|
Re: Programm starten und auf Programmende warten
Liste der Anhänge anzeigen (Anzahl: 1)
Hier eine Unit von Olli:
|
Re: Programm starten und auf Programmende warten
Hi!
Schau mal in der Suche nach! Ich kann mich erinnern, dass es vor kurzem (vor ein, zwei Tagen) schon mal so was ähnliches gefragt worden ist (Hier war es das gleiche nur mit notepad.exe)! |
Re: Programm starten und auf Programmende warten
Das Problem an der ShellApiEx ist, dass mein Programm so lange "in der Luft hängt", bis das Programm beendet wurde. Wenn man also ein anderes Fenster über das meinige zieht, dann verschwinden alle Elemente aus der Listbox (wie bei einem hängengebliebenen Programm). Das finde ich aber ... uncool ;p
[edit]Das war übringes auch das Problem in dem anderen ![]() |
Re: Programm starten und auf Programmende warten
Das it ja geade der Sinn dieser Codes, daß die Befehler auf das Beenden des aufgerufenen Programms warten ^^
Du kannst aber den Programmaufruf in einen Anderen Thread auslagern, somit kann der Hauptthread unbehelligt weiterarbeiten. Notfalls machst du dir auch einfach 'ne Schleife in den Hauptthread, welche solange wartet, bis der Thread (mit dem Programmaufruf fertig ist). Und in diese Schleife dann ein Application.ProgressMessages und ein Sleep(100), oder sowas in der Art. |
Re: Programm starten und auf Programmende warten
Hinters
Delphi-Quellcode:
am besten immer ein
application.processmessages
Delphi-Quellcode:
Damit der User das Programm auch beenden kann, während es in der Schleife wartet.
if application.terminated then exit;
|
Re: Programm starten und auf Programmende warten
Zitat:
Zitat:
|
Re: Programm starten und auf Programmende warten
Zitat:
Aber du kannst dann ja durch die Schleige im Hauptthread dennoch warten ;) Zitat:
Delphi-Quellcode:
ThreadStartenUndDateiÜbergeben...
// prüfen ob Thread noch Läuft While isThreadNochAktiv // prüfen of der Benutzter einen Abbruch wünscht and not Application.Terminated do Begin // Botschaftswarteschlange abarbeiten Application.ProcessMessages; // kleine Pause ... für die CPU-Auslastung Sleep(100); End; |
Re: Programm starten und auf Programmende warten
Gut, ich hab mir jetzt also einen Thread dazu erstellt, in dem die Programme gestartet werden können. Hier die neuen Probleme ;-)
- Im Thread kann ich mit ShellExecuteAndWait() keine übergebene Datei (vom Typ string) aufrufen, da ShellExecuteAndWait() eine Var vom Typ PWideChar verlangt. Eine Typenumwandlung mit PWideChar() bringt nichts. - Mit Sleep() hängt mein Programm genauso wie bei ShellExecuteAndWait() :-/ - Mir fällt keine Lösung ein, wie ich überprüfen könnte, dass der Thread noch existiert, wenn ShellExecuteAndWait() nicht geht. Ansonsten könnte man sowas machen ...
Delphi-Quellcode:
//Thread
ThreadGestartet:=True; ShellExecuteAndWait(); ThreadGestartet:=False; //Hauptprogramm Thread.Create() //Irgendwie warten (while-Schleife?) if not uThread.ThreadGestartet then MachWeiterMitDemLustigenProgramm; |
Re: Programm starten und auf Programmende warten
Ich kenne mich nicht besonders aus mit Threads, aber was ich mir grade gedacht hab, war, dass man den Thread doch irgendwie releasen oder terminieren muss, wenn man ihn beenden will. Kann man auf diese Art vielleicht rausfinden, ob der Thread noch am laufen ist? Nein? Aaaaah! Hilfe ;-)
|
Re: Programm starten und auf Programmende warten
Hi Aike,
Probiere mal das:
Delphi-Quellcode:
procedure TMainForm.runProcess(ExeName, Parameter: String; wait: boolean);
var SUInfo: TStartupInfo; ProcInfo: TProcessInformation; bool:boolean; begin FillChar(SUInfo, SizeOf(SUInfo), #0); with SUInfo do begin cb := SizeOf(SUInfo); dwFlags := STARTF_USESHOWWINDOW; end; bool := CreateProcess(NIL, PChar(EXEName+' '+Parameter), NIL, NIL, FALSE, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, NIL, PChar(ApplicationDir), SUInfo, ProcInfo); if (bool)and(wait) then while WaitForSingleObject(ProcInfo.hProcess, 100 {INFINITE})=WAIT_TIMEOUT do begin //refresh; Application.ProcessMessages; if Application.Terminated then Break; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 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