Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Programm aktualisieren (Codehilfe) (https://www.delphipraxis.net/180981-programm-aktualisieren-codehilfe.html)

Bladefire 4. Jul 2014 19:59

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:
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.

nuclearping 4. Jul 2014 23:18

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).

Dejan Vu 5. Jul 2014 07:25

AW: Programm aktualisieren (Codehilfe)
 
Zitat:

Zitat von nuclearping (Beitrag 1264508)
...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 :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

himitsu 5. Jul 2014 08:09

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?

Dejan Vu 5. Jul 2014 08:36

AW: Programm aktualisieren (Codehilfe)
 
Zitat:

Zitat von himitsu (Beitrag 1264517)
also kann ich ja dessen bereits geladendenen Code doch gleich mit verwenden. :roll:

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). :thumb:

Sir Rufo 5. Jul 2014 08:46

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.
  • 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.

himitsu 5. Jul 2014 08:58

AW: Programm aktualisieren (Codehilfe)
 
Zitat:

Zitat von Dejan Vu (Beitrag 1264518)
geht das immer.

Nein.

Luckie 5. Jul 2014 09:11

AW: Programm aktualisieren (Codehilfe)
 
Und es kann dir passieren, dass Virenscanner anschlagen, wenn sich eine Exe selber manipuliert.

Dejan Vu 5. Jul 2014 09:28

AW: Programm aktualisieren (Codehilfe)
 
Zitat:

Zitat von himitsu (Beitrag 1264520)
Zitat:

Zitat von Dejan Vu (Beitrag 1264518)
geht das immer.

Nein.

Wieso nicht? Unter welchen Umständen denn?

Bladefire 5. Jul 2014 10:02

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 10:57 Uhr.
Seite 1 von 2  1 2      

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