![]() |
Programm aktualisieren (Codehilfe)
Hi,
Ich möchte das sich mein Programm automatisch erneuert. Was mache ich falsch? (hin und wieder funktioniert es ohne das sich etwas offensichtliches verändert hat)
Code:
Danke für eure hilfe
var
Form1: TForm1; Inidatei: TInifile; Dateinname: string; implementation {$R *.dfm} procedure updaten; var Datei: TFileStream; begin // neue datei wird erstellt Datei := TFileStream.Create(extractfilepath(application.ExeName)+'project2.exe',fmCreate or fmShareDenyWrite); // neue datei wird beschrieben Form1.idhttp1.Get('http://{url}.project2.exe',Datei); // Neue datei wird ausgeführt Datei.Free; renamefile(application.ExeName,'old123123.exe'); ShellExecute(Application.Handle, 'open', PChar(extractfilepath(application.ExeName)+'project2.exe'), nil, nil,SW_SHOWNORMAL); Form1.Close; end; procedure löschen; begin deletefile(extractfilepath(application.ExeName)+'old123123.exe'); renamefile(application.ExeName,'project1.exe'); end; procedure TForm1.Button1Click(Sender: TObject); begin updaten; end; procedure TForm1.FormCreate(Sender: TObject); begin showmessage('wird wenigstens gestartet'); löschen; Lg Simon ______ Edit: es kommt manchmal vor das die neu heruntergeladene datei zwar als prozess im task manager angezeigt wird, das Ereignis "FormCreate" wird allerdings nicht ausgelöst. |
AW: Programm aktualisieren (Codehilfe)
Korrekterweise solltest du eine externe Anwendung den Job erledigen lassen, die Hauptanwendung zu aktualisieren. Die Hauptanwendung kann zwar das Update herunterladen, aber die neue Version übernehmen sollte eine extra Anwendung machen. Dann erledigt sich das wohl auch mit dem "mal gehts und mal gehts nicht".
Weil so wie du's jetzt machst, mag es zwar (manchmal) funktionieren, ist aber trotzdem falsch. Eine Anwendung sollte sich nicht selbst löschen oder umbenennen. Also: Hauptanwendung startet "Updater.exe" (mit Adminrechten!) und schließt sich selbst. "Updater.exe" wartet darauf, dass sich "Hauptanwendung.exe" beendet hat (nicht mehr in der Task-Liste ist), lädt die neue Version herunter, löscht Hauptanwendung.exe, kopiert dann die neue .exe und startet wieder die (neue) Hauptanwendung.exe (nur mit Benutzerrechten). |
AW: Programm aktualisieren (Codehilfe)
Zitat:
Ich glaube, eine Anwendung *kann* sich nicht löschen, aber umbenennen sehr wohl. Ich selbst haber das früher mit einem Updater so gemacht und das funktionierte (eigentlich :gruebel:) Allerdings habe ich die Datei 1. unter dem Namen 'Programm.NEW' geladen, 2. dann 'Programm.OLD' gelöscht 3. dann 'Programm.EXE' in 'Programm.OLD' umbenannt 4. dann 'Programm.NEW' in 'Programm.EXE' umbenannt 5. das Programm.EXE neu gestartet |
AW: Programm aktualisieren (Codehilfe)
Wenn du glück hast, kommt das OS auf die Idee und Cacht den Code.
Ein Programm startet unter dem selben Namen, wie ein schon/noch Laufendes, also kann ich ja dessen bereits geladendenen Code doch gleich mit verwenden. :roll: Und es ist nicht sicher immer möglich, daß eine Anwendung einfach so umbenannt werden kann, wenn sie gerade geöffnet ist, was natürlich voll blöd ist, daß der TE praktisch keinerlei Fehlerprüfung in seinen Code eingebaut hat. Der TStream wirft zwar Exceptions, aber bei RenameFile, ShellExecute und DeleteFile wird das Result und der Fehlercode einfach ignoriert. PS: Warum ist der Updaten-Code eigentlich nicht in TForm1 drin, wo er doch ständ Dinge davon verwendet? Oder Warum bekommt er die Dinge, welche er einfach so verwendet, nicht als Parameter rein? |
AW: Programm aktualisieren (Codehilfe)
Zitat:
Zitat:
Du meinst aber allgemein den grottigen Code (ohne jegliche Fehlerbehandlung). :thumb: |
AW: Programm aktualisieren (Codehilfe)
@nuclearping
Wenn eine externe Anwendung das Installieren übernimmt (dem stimme ich grundsätzlich zu), dann kann diese externe Anwendung auch gleich das Suchen und Herunterladen übernehmen. Diesem externen (nennen wir es einfacherhalber mal) Updater übergibt die Hauptanwendung die nötigen Informationen (Version, Update-Quelle/n, ...) und der Updater kann mit seiner Arbeit beginnen.
PS Für eine Benutzer-Sorglos-Update-Funktion benötigt man dafür (auch noch) einen Dienst im Administrator-Kontext. Ist aber Geschmackssache und hängt vom Einsatzumfeld ab. |
AW: Programm aktualisieren (Codehilfe)
Zitat:
|
AW: Programm aktualisieren (Codehilfe)
Und es kann dir passieren, dass Virenscanner anschlagen, wenn sich eine Exe selber manipuliert.
|
AW: Programm aktualisieren (Codehilfe)
Zitat:
|
AW: Programm aktualisieren (Codehilfe)
Danke für eure vielen Antworten.
Ich möchte noch klarstellen, dass sich die exe von mir nicht (die gleiche datei) selber löscht, sondern die neu heruntergeladene löscht die alte datei. Könnte es möglich sein, dass es bei mir probleme mit prozessnamen gibt, denn wenn ich ein Programm während der laufzeit unbennene so hat es noch immer den gleichen Prozessnamen. Ich habe auch das gefühl das es hin und wieder das alte programm nicht löscht, weil es noch gelaufen ist während das neue Programm ausgeführt wurde. Ich werde vermutlich an diesem System festhalten und korregieren. Nichtsdestotrotz werde ich mir die vorschläge einer extra exe. (die man dann für sogut wie jedes Projekt leicht verändert verwenden kann) zu Herzen nehmen. @nhimitsu, der Code ist in Form1 drinnen. lg Simon _______________ Anmerkung: Ablauf wenn ich das Programm mehrmals ausführe (also: datei wird heruntergeladen, datei löscht alte datei, datei ändert seinen namen -> datei wird heruntergeladen) 1. Durchgang: Die heruntergeladene Datei ersetzt die alte Datei. Die neue Datei heißt nun zwar Project 1, in der Taskmanager sagt mir allerdings das der prozess projekt2 heißt. (unter diesem namen wurde es noch gestartet und es hat sich dann selbst unbenannt). --> alles so wie gelpant 2. Durchgang: Datei projekt1.exe (prozessname: projekt2.exe) lädt die datei projekt2.exe herunter. (projekt1.exe bennent sich in old123123.exe um und wird geschlossen) diese wird nun gestartet. --> Beide datein old123123.exe sowie project1.exe (die neu heruntergeladene datei. sind noch vorhanden allerdings läuft keine anwendung/prozess von den beiden. 3. Durchgang: (project1.exe wird von mir diesmal manuel gestartet. old123123.exe wird beim start gelöscht.) Ansonsten ist dieser Durchgang gleich wie der 1. Durchgang. 4. Durchgang: Wie durchgang 2. 5. Durchgang: Wie durchgang 3. 6. Durchgang: Wie durchgang 1. usw. __________________________________________________ _______________ Ich habe das gefühl das es am Prozessnamen liegt. @ himitsu, ich denke du hast recht, ich bin mir zwar nicht ganz sicher was du mit(" Cacht den Code.") meinst, aber ich vermute das es daran liegt. Was kann ich nun dagegen Unternehmen (wenn ich es ohne update.exe lösen möchte)? __________________________________________________ _______________ Anmerkung: Wie es ausschaut ist es doch nicht ganz so zufällig warum es funktioniert und warum nicht. Ich habe vor erstellen dieses Threads hin und wieder nicht gesehen das sich die messagebox geöffnet hat (das programm noch nicht gestartet wurde, bis ich auf ok klicke). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 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 by Thomas Breitkreuz