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
Dejan Vu
(Gast)

n/a Beiträge
 
#1

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 himitsu
himitsu

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

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 08:58
geht das immer.
Nein.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

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
 
#4

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
 
#5

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
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, 10:13
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.
Unter anderem aus diesen Gründen sollte man eine separate Update-Anwendung verwenden.

Nicht, dass das nicht auch so gehen würde, aber bei jedem Release muss man höllisch aufpassen, dass dieser Update-Code funktioniert. Und wofür? Weil der Code genau einmal zum Einsatz kommt? Dann doch lieber einen Updater der einmal gebaut und (bei jedem Update) immer wieder benutzt werden kann.

Kleines Beispiel:
Ändert sich z.B. der Mutex-Name (erkennen ob die alte Anwendung noch läuft), dann muss die neue Anwendung alle alten Mutex-Namen kennen sonst knallt es. Der Updater bekommt von der aktuellen Anwendung den Mutex-Namen mitgeteilt und kümmert sich entsprechend.

Bevor mir jetzt einer kommt "Ich benutze keinen Mutex" oder "Mein Mutex ändert sich nicht" - es ist nur ein Beispiel was mir jetzt adhoc mal eingefallen ist und aufzeigen soll, dass kleine Änderungen einen Rattenschwanz hinter sich herziehen können, die durch einen externen Updater wesentlich eleganter und einfacher gelöst werden können.
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)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 11:31
Executables werden vom Windows ja wiederverwendet.
Das kennt man z.B. von DLLs, wo ja viele Programme die selben DLLs benutzten und es demnach natürlich praktisch ist, wenn die DLL dann nur einmal im physischem RAM liegt und dann nur noch bei all den Programmen in den virtuellen Arbeitsspeicher gemappt wird.
Und auf Seiten vom Windows sind EXE und DLL genau das Selbe.
Ach ja, dank Copy-On-Write stört es dann natürlich nicht, wenn Programme ihren Code patchen, da es nur auf die eigene DLL einen Einfluß hat und nicht auf alle Programme.

Nur ist natürlich nirgendwo dokumentiert wie Windows erkennt, ob es sich um die selbe EXE/DLL handelt, was man z.B. auch ganz einfach anhand des Dateinamens bestimmen könnte.


Und das Wann es eventuell nicht geht ... da kann es viele Gründe geben
- das Dateisystem
- Dateisystemtreiber
- Virenscanner und Co.
- andere Dateizugriffe
- Netzlaufwerke
- ...
- und letztendlich kommt das alles irgendwie darauf an WIE die Datei geöffnet ist.

Und dann ist es nunmal kein offiziell dokumentiertes und festgelegtes Verhalten,
was sich somit irgendwann auch wieder ändern könnte.

Billigstes Beispiel:
Delphi-Quellcode:
procedure TForm23.FormCreate(Sender: TObject);
begin
  TFileStream.Create(Application.ExeName, fmOpenRead or fmShareDenyNone);
end;

PS: Normaler Weise hat (sollte) ein einfaches "Benutzer"-Programm keine Rechte besitzen, um einfach so irgendwelche Programme zu ändern. (siehe Programme-Verzeichnis)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 5. Jul 2014 um 11:35 Uhr)
  Mit Zitat antworten Zitat
nuclearping

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

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 20:00
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.
Nun, kannste so machen, klar. Aber die Zeit, die du damit verschwendest, an "diesem [fragwürdigen] System" festzuhalten und es auf Biegen und Brechen zu korrigieren, könntest du besser darin investieren, die hier bereits mehrfach empfohlene Updater-Anwendung zu programmieren. Denn darauf wirds früher oder später sowieso hinauslaufen, wenn du das Problem ordentlich und idiotensicher gelöst bekommen willst.

Und es ist ja nicht so, dass das Raketenwissenschaft ist. Du musst halt nur deinen Updater-Code, den du schon in deiner Form1 mitschleppst, in eine externe Anwendung auslagern und dich dann nur noch um den korrekten Ablauf kümmern (also Updater mit erhöhten Rechten (Adminrechten) starten, Hauptprogramm schließen, Update durchführen, Hauptprogramm neu starten (nur mit User-Rechten)).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 21:21
Man kann ja problemlos das Update im Hintergrund mit dem Programm runterladen und validieren. (machen viele Programme)

Aber das Installieren/Kopieren sollte etwas Anderes machen.
Das kann aber auch ein Script sein ... Batch (bat), Commandfile (cmd), PowerShell (ps), ...
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
pelzig
(Gast)

n/a Beiträge
 
#10

AW: Programm aktualisieren (Codehilfe)

  Alt 5. Jul 2014, 21:55
Nur als Anregung

Mein upzudatendes Hauptprogramm (chef.exe) übergibt meiner updater.exe zwei Parameter:

"Pfad zu chef.exe" und die interne
Versionsnummer von chef.exe als String (z.B. "20131224" für letztes Jahr Weihnachten)

Updater.exe beendet chef.exe und ermittelt aus dem Pfad die URL für den Download des Updates und die URL für die aktuelle Versionsnummer:
http://www.myhomepage.demo/updates/chef.exe und
http://www.myhomepage.demo/updates/chef.txt

Der Inhalt von chef.txt wird mit dem zweiten Parameter verglichen und - je nach Ergebnis das Update heruntergeladen - chef.exe wieder gestartet.

Mit Delphi 7 PE und den Indies (IdHTTP unter Win 8.11 Pro) kein Hexenwerk, da Windows für updater.exe (aufgrund des Echsennamens) automatisch höhere Rechte einfordert.

Bei meinen Updates geht es immer um mehrere Dateien, die aktualisiert werden müssen, daher lädt mein updater.exe ZIP-Dateien herunter und entpackt sie anschließend in den Pfad von chef.exe.

TZip: http://www.angusj.com/delphi/

Allerdings hat mein chef.exe nichts mit Datenbanken zu tun - wie auch, mit Delphi 7 PE

MfG
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:58 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