![]() |
Shellexecute
Hi,
Wie kann ich Eine Datei starten und die hauptdatei schliessen OHNE das die hauptdatei noch inuse ist. Habs mit Shellexecute versucht aber da tut er die hauptdatei noch benutzen, den ich kann die datei nicht löschen. Das ganze ist ein updateprogramm wo die project1.exe eine update.exe aufruft die project2.exe die geladen wurde und im temp ordner liegt soll dann die project1.exe ersetzen allerdings ist die project1.exe noch in benutzung da ich ja die update.exe noch offen hab. erst wenn ich die update.exe beende und sie nochmal manuell aufrufe funktioniert das mit dem ersetzen. Kann mir da vielleicht einer weiterhelfen ? Mfg Capa |
AW: Shellexecute
Wenn die alte Version die Update.exe aufruft, kann sie sich doch anschließend beenden. Die Update.exe wartet dann darauf, dass das Programm geschlossen wurde und ersetzt es dann durch die neue Version.
|
AW: Shellexecute
das hab ich ja versucht aber ein einfaches close oder terminate scheint nicht zu helfen
die project1.exe ist immernoch inuse und kann von der update.exe nicht überschrieben werden.
Delphi-Quellcode:
so rufe ich immo die datei auf und beende das programm
try
ShellExecute(0, nil, PChar(ExtractFilePath(paramstr(0))+'temp\update.exe'), nil, nil, SW_Normal); except ShowMessage('Update fehlgeschlagen!'+#10+#13+'Konnte Update-Datei nicht finden!'); end; Application.Terminate; |
AW: Shellexecute
Hast du es mal außerhalb des Debuggers probiert? Oder hast du evtl keine Schreibrechte(Vista/7)?
Ansonsten könnte es sein, dass ShellExecute das startende Programm als ParentProcess verwendet. Wenn dem so ist könnte man evtl mit ![]() Prüfen sollte man das mit dem ![]() Benutzt du zufällig den ![]() |
AW: Shellexecute
Hallo,
solche Sachen kann man mit AutoIt-Scripten gut lösen. Sachen wie Dateien ersetzen,umbenennen, Archive entpacken usw sind mit ein paar Zeilen Code hinzubekommen, wenn nötig auch mit graphischer Benutzeroberfläche. Habe mir schon einige für mich sehr praktische Tools gebastelt; z.B. ein Fernwartungsprogramm auf VNC Basis (nur neue Oberfläche mit unserem Firmenlogo) Automatisierung für Ressourcen-Compiler, Sicherung von Firebird Datenbanken sowie Rebuild für Firebird-Datenbanken (macht eine Datensicherung, dann Shutdown der Datenbank, nennt die alte Datenbankdatei um und baut die Datenbank aus der Sicherung wieder auf). Gruß Ralf |
AW: Shellexecute
ShellExecute wird im Falle eines Fehler mit der eventuellen Zieldatei garantiert keine Exception werfen.
Try-Except ist alles komplett fehl am Platz. > Stattdessen gibt diese Funktion den "Erfolgsbericht" als Result zurück, welches man also auswerten sollte. Ja, auch ShellExecute könnte eine Exception werfen, aber wenn, dann lag es an einem fehlerhaften Aufruf, wie z.B. einem ungültigen Pointer/String ... also wenn es da doch mal knallt, dann lag es an einem Bediehnungsfehler/Programmierfehler und keiner zu erwartenden Ausnahmebehandlung. > Try-Except bleibt also falsch und es würde in soeinem Fall die eigentliche Fehlerursache sträflichst verfälschen. |
AW: Shellexecute
also habs nun mit CreateProcess versucht
im Process Explorer wird die project1.exe unter explorer.exe aufgeführt indem moment wo er die update.exe startet ist sie erst unter der project1.exe und dann ca 1-2sec später steht sie ganz alleine da also ohne parent, in dem moment verschwindet auch die project1.exe ausm PE. Trotzdem tut er es nicht updaten bzw die project1.exe nicht löschen. Und ja ich teste es ohne Debugger. Warum tut try except das verfälschen wenn es nur darum geht das die update.exe ihre arbeit nicht machen kann ? EDIT: mom seh gerade wenn ich auf einstellungen schaue da steht unter Parent die project1.exe doch drin |
AW: Shellexecute
Hallo Capa,
ich hatte mal einen ähnlichen Fall so gelöst: Eine Starter-Datei prüft, ob Updates vorliegen. Ist dass der Fall, wir die eigentliche Anwendung ausgetauscht und dann erst gestartet. Der Start meines Programmes erfolgte also stets über eine 2. Datei. |
AW: Shellexecute
mhh die idee ansich ist nicht schlecht aber ich hab halt in meinem programm das updatefenster
schon eingebaut ^^ bzw soll es halt auch so funktionieren das nach nem update gesucht werden kann wenn das programm schon läuft. EDIT: Mir ist da gerade was aufgefallen! wenn ich die project1.exe starte und dann den updateprocess ausführe spinnt die update.exe rum weil halt nen parent gesetzt ist. starte ich aber die update.exe macht der das update und startet dann wieder das programm, wenn ich dann wieder update mache klappt alles genau so wie es soll. und solange ich das fenster nicht schliesse klappt das alles und ich kann das so oft durchlaufen lassen wie ich will. Warum also nicht wenn ich die project1.exe als erstes starte, liegt das vielleicht daran das die update.exe ne consolenapplication ist? |
AW: Shellexecute
Hast du dir auch die vielen Parameter angeschaut, die man CreateProcess mitgeben kann?
Ich glaube man konnte da auch einen neuen Prozess erstellen, der dann nicht unter dem tartendem Prozess läuft. Schau dir mal die structs (=^records) an, die bei ![]() |
AW: Shellexecute
Mmh, was passiert, wenn du
a: in der Update.exe ein delay setzt (1-2s) oder b: in der Update.exe prüfst, ob die Ausgangsdatei noch läuft? In deinem Code startest du erst die Update.exe und beendest dann dein Programm. Das könnte zeitlich problematisch werden. In meinem Programm hatte ich auch die Möglichkeit, aus der Hauptanwendung (HA) ein Update durchzuführen. Dazu habe ich aus der HA in eine INI geschrieben, dass geupdated werden soll, dann die Starter.exe aufgerufen und Anwendung geschlossen. In der Starter.exe habe ich 2 Dinge geprüft: 1. Liegt laut DB ein Update vor? 2. Steht in der INI ein Hinweis auf ein Update? So konnte ich bei allen Usern getrennt ein Update erzwingen, selbst wenn eigentlich die letzte Version vorlag (nach DB). Dies ermöglichte es mir, gewisse Funktionen mit den Clients durchsprechen, bevor ich Sie veröffentlicht habe. |
AW: Shellexecute
in der update.exe läuft eine schleife solange bis er die project1.exe löschen kann
hatte vorher eine isinuse abfrage drin aber dachte das klappt nicht und hab halt das mit dem löschen eingebaut, aber das klappt ja genauso wenig ^^ Habs mit createprocess so gemacht
Delphi-Quellcode:
Und wie ich gerade sehe hat der auch kein parent mehr nur das der die datei noch nicht löschen will,
var
StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin FillChar(StartupInfo, SizeOf(StartupInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := SW_SHOW; CreateProcess(nil,PCHar(ExtractFilePath(paramstr(0))+'temp\update.exe'),nil,nil,False,0,nil,nil,StartupInfo,ProcessInfo) end; nun muss ich nur noch rausfinden warum nicht! |
AW: Shellexecute
Bin durch zufall selbst drauf gekommen.
Der Ordner muss mit übergeben werden wo er es ausführen soll wenn ich also in der project1.exe beim starten der update.exe den ordner wo die update.exe liegt mit übergebe dann funzt alles genauso mach ichs wenn die update.exe die "Neue" Project1.exe aufruft den ordner '..\' angeben und dann kann ich auch den temp ordner wieder löschen. den nur weil ich den nicht löschen konnte bin ich drauf gekommen das mal zu versuchen.
Delphi-Quellcode:
Danke an alle die geholfen haben :)
CreateProcess(nil,PCHar('..\project1.exe'),
nil,nil,False,0,nil,PChar('..\'),StartupInfo,ProcessInfo) bzw. CreateProcess(nil,PCHar(ExtractFilePath(paramstr(0))+'temp\update.exe'), nil,nil,False,0,nil,PChar(ExtractFilePath(paramstr(0))+'temp\'),StartupInfo,ProcessInfo) Mfg Capa |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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