AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Programm aktualisieren (Codehilfe)
Thema durchsuchen
Ansicht
Themen-Optionen

Programm aktualisieren (Codehilfe)

Ein Thema von Bladefire · begonnen am 4. Jul 2014 · letzter Beitrag vom 7. Jul 2014
Antwort Antwort
Seite 1 von 2  1 2      
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#1

Programm aktualisieren (Codehilfe)

  Alt 4. Jul 2014, 19:59
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:
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;
Danke für eure hilfe

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.

Geändert von Bladefire ( 4. Jul 2014 um 20:02 Uhr)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Programm aktualisieren (Codehilfe)

  Alt 4. Jul 2014, 23:18
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).
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 07:25
...mag es zwar (manchmal) funktionieren, ist aber trotzdem falsch. Eine Anwendung sollte sich nicht selbst löschen oder umbenennen.
Warum ist das 'falsch' und warum 'sollte' sich 'eine Anwendung' nicht selbst löschen oder umbenennnen'? Das klingt so, als ob das geht, aber aus Pietätsgründen (oder warum auch immer) nicht erwünscht ('sollte') ist.

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 )

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

Geändert von Dejan Vu ( 5. Jul 2014 um 07:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.135 Beiträge
 
Delphi 12 Athens
 
#4

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 08:09
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.

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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 08:36
also kann ich ja dessen bereits geladendenen Code doch gleich mit verwenden.
Ja, aber *löschen* geht trotzdem nicht.
Zitat:
Und es ist nicht sicher immer möglich, daß eine Anwendung einfach so umbenannt werden kann, wenn sie gerade geöffnet ist,
Wenn der neue Name nicht existiert, geht das immer.

Du meinst aber allgemein den grottigen Code (ohne jegliche Fehlerbehandlung).
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 08:46
@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.
  • Suchen nach einer neueren Version bei den Quellen
  • Informieren über vorhandene Updates
  • Herunterladen der Updates
  • Beenden der Hauptanwendung
  • Installieren der Updates
  • Start der (nun aktualisierten) Hauptanwendung
  • Sich selber beenden
Und eh man sich versieht hat man einen universellen Updater für alle entwickelten Anwendungen und die Anwendung selber hat nur eine klitzekleinen Overhead für das Ausführen des Updaters und nicht einen ganzen Verhau an nicht anwendungsrelevantem Code.

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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 5. Jul 2014 um 08:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.135 Beiträge
 
Delphi 12 Athens
 
#7

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 08:58
geht das immer.
Nein.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 09:11
Und es kann dir passieren, dass Virenscanner anschlagen, wenn sich eine Exe selber manipuliert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#9

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 09:28
Wieso nicht? Unter welchen Umständen denn?
  Mit Zitat antworten Zitat
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#10

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 10:02
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).

Geändert von Bladefire ( 5. Jul 2014 um 10:32 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz