Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - status von shellexecute anzeigen
Maisinator - Sa 19.09.09 17:22
Titel: status von shellexecute anzeigen
hallo,
wie kann ich bei einem programm, welches ich mit schellexecute ausführe, den status anzeigen? vlt. mit statusbar usw...???
THX
Xentar - Sa 19.09.09 17:38
Was für einen "Status" meinst du..?
Maisinator - Sa 19.09.09 18:14
ich mein, wenn man ein programm mit shellexecute öffnet, was ein bisschen größer ist (so 20 mb) dauert es ja immer ein bisschen, bis das programm geladen wurde, diesen zeitraum mein ich mit status. also etwas ähnliches, wie z.b. das windows kopierfenster, mit dem statusbalken oder einfach eine prozentzahl, die ansteigt...
Xentar - Sa 19.09.09 19:11
*grübel* so ein Thema hatten wir doch vor Kurzem erst.
Und dabei sind wir zu dem Ergebnis gekommen, dass man NICHT rausfinden kann, wann ein Programm "fertig" gestartet ist - da man eben nicht weiß, was das Programm zur Initialisierung noch alles macht.
jaenicke - Sa 19.09.09 19:15
Man kann das ohne Rückmeldung von dem Programm nicht als Fortschritt anzeigen, aber bei den meisten Programmen kann man durchaus erkennen, wenn die fertig geladen sind.
Dazu gibts auch was in der Library.
// EDIT:
Doch nicht in der Library, aber im Forum: :mrgreen:
http://www.delphi-forum.de/viewtopic.php?p=460553#460553
Tryer - Sa 19.09.09 19:34
Eine Lösung mit ShellExecuteEx() und WaitForInputIdle() ist auch denkbar.
Ein "Prozentwert" ist nur denkbar wenn man das Startverhalten der Anwendung genau kennt, dann kann man z.B. die Anzahl der erzeugten Threads/Handle und den Speicherverbrauch auswerten. Weder leicht noch sehr präzise. WaitForInputIdle oder die Funktion welche Jaenicke genannt hat erlauben es aber zumindest eine Sanduhr anzuzeigen o.ä.
Grüsse, Dirk
Maisinator - Sa 19.09.09 20:29
ok, danke. wie würde das denn mit WaitForInputIdle() aussehen?
Maisinator - Sa 19.09.09 21:40
mmh ja, im gegensatz zu shellexecute versteh ich diesmal nur bahnhof :cry:
kann mir das vlt. jemand erklären?? bitte...
jaenicke - Sa 19.09.09 21:42
Na gut, bin ja nicht so, hier ein Auszug aus meinem Updater Projekt: ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| procedure ExecuteNewInstance(AExplicitAdmin, AWait: Boolean; AWindow: THandle; AParams: string); var ExecuteInfo: SHELLEXECUTEINFO; begin ExecuteInfo.cbSize := sizeof(SHELLEXECUTEINFO); ExecuteInfo.Wnd := AWindow; ExecuteInfo.fMask := SEE_MASK_NOCLOSEPROCESS; if AExplicitAdmin then ExecuteInfo.lpVerb := 'runas' else ExecuteInfo.lpVerb := 'open'; ExecuteInfo.lpFile := PChar(ParamStr(0)); ExecuteInfo.lpParameters := PChar(AParams); ExecuteInfo.lpDirectory := PChar(ExtractFilePath(ParamStr(0))); ExecuteInfo.nShow := SW_SHOWNORMAL;
if ShellExecuteEx(@ExecuteInfo) then try if AWait then WaitForSingleObject(ExecuteInfo.hProcess, INFINITE); finally CloseHandle(ExecuteInfo.hProcess); end; end; |
Da muss stattdessen halt nur WaitForInputIdle hin. Und lpFile muss den richtigen Dateinamen statt der eigenen Exe bekommen (wie ich es brauchte). ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!